Listings 笔记
listings 笔记
虽然是使用listings
宏包,但是在使用环境的时候是使用lstlisting
basicstyle = <basic style>
可以在每个列表的开头选择. 你可以使用 \footnotesize
, \small
, \itshape
, \ttfamily
,或者其他的. The last token of
<basic style> 的最后一个标记不能读取以下任何字符(这一句翻译的怪怪的).
如果你发现你的代码没有自动换行,可以加上这句
breaklines=true
我们再设定一下代码块的语言和样式
language=Java,
keywordstyle={\bfseries\color{NavyBlue}}
这边要把xcolor宏包引入
如果你觉得listings自带的关键字不够,可以自己手动添加关键字
morekeywords={String}
有些不是关键字,但是是重要的类,可以使用强调(同样的,想要强调明显,也需要给强调设置样式)
emph={Controller,@RequestParam,CommonsMultipartFile,HttpServletRequest,IOException,@Controller,OutputStream, InputStream, @RequestMapping, HttpServletResponse,@PostMapping,File},
emphstyle={\bfseries\color{Tan}}
这时候我们会发现不仅下面的代码强调了,连导入的包中对应的词都强调了,这是我们不想看见的,因此我们可以使用
alsoletter{.}
这样前面有点的强调字就不会被记录在被强调的里面了
效果如图
除此之外,我们还可以设置这些
backgroundcolor={\color{yellow!40!white}}, % 设置背景颜色
frame=shadowbox, % 设置边框
rulecolor={\color{purple}}, % 设置边框线条颜色
rulesepcolor={\color{orange}}, % 设置边框线条和代码块间的颜色
framesep=1em, % 设置代码块和边框的距离
numbers=left, % 设置代码行数的位置
numbersep=2em, % 设置代码行数离代码的距离
numberstyle={\sffamily\footnotesize} % 设置代码行数的样式
最后的效果如图所示,
如果我们需要写很多的代码块,那我们可以把公共的部分放在最前面的 \lstset
中
listings的demo
\begin{lstlisting}[
basicstyle=\ttfamily,
breaklines=true,
language=Java,
morekeywords={String},
keywordstyle={\bfseries\color{NavyBlue}},
emph={Controller,@RequestParam,CommonsMultipartFile,HttpServletRequest,IOException,@Controller,
OutputStream, InputStream, @RequestMapping, HttpServletResponse,@PostMapping,File},
emphstyle={\bfseries\color{Tan}},
alsoletter={.},
backgroundcolor={\color{yellow!40!white}}, % 设置背景颜色
frame=shadowbox, % 设置边框
rulecolor={\color{purple}}, % 设置边框线条颜色
rulesepcolor={\color{orange}}, % 设置边框线条和代码块间的颜色
framesep=1em, % 设置代码块和边框的距离
numbers=left, % 设置代码行数的位置
numbersep=2em, % 设置代码行数离代码的距离
numberstyle={\sffamily\footnotesize} % 设置代码行数的样式
]
package com.luo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@Controller
public class FileController {
@PostMapping("/upload")
public String upload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
// 获取文件名:file.getOriginalFilename();
String uploadFileName = file.getOriginalFilename();
// 如果文件名为空,直接回到首页
if("".equals(uploadFileName)||uploadFileName == null){
return "redirect:/index.jsp";
}
System.out.println("上传文件名为:"+uploadFileName);
// 上传文件路径保存设置
//String path = request.getRealPath("/upload");
String path = request.getSession().getServletContext().getRealPath("/upload");
// 如果路径不存在,创建一个
File realPath = new File(path);
if(!realPath.exists()){
boolean mkdir = realPath.mkdir();
if (!mkdir) return "redirect:/index.jsp";
}
System.out.println("上传文件保存地址:"+realPath);
// 文件输入流
InputStream is = file.getInputStream();
// 文件输出流
OutputStream os = new FileOutputStream(new File(realPath,uploadFileName));
// 读取写出
int len=0;
byte[] buffer = new byte[1024];
while ((len= is.read(buffer))!=-1){
os.write(buffer,0,len);
os.flush();
}
os.close();
return "redirect:/index.jsp";
}
@RequestMapping("/download")
public String downloads(HttpServletRequest request,HttpServletResponse response) throws IOException {
// 要下载的图片地址
String path = request.getSession().getServletContext().getRealPath("/upload");
String filename = "18R.py";
// 1. 设置 response 响应头
// 设置页面不缓存,清空buffer
response.reset();
// 字符编码
response.setCharacterEncoding("UTF-8");
// 二进制传输数据
response.setContentType("multipart/form-data");
// 设置响应头
response.setHeader("Content-Disposition",
"attachment;filename="+ URLEncoder.encode(filename, StandardCharsets.UTF_8));
File file = new File(path,filename);
// 2. 读文件--输入流
InputStream input = new FileInputStream(file);
// 3. 写出文件--输出流
OutputStream output = response.getOutputStream();
byte[] buffer = new byte[1024];
int index=0;
// 4. 执行写出操作
while((index=input.read(buffer))!=-1){
output.write(buffer,0,index);
output.flush();
}
output.close();
input.close();
return null;
}
}
\end{lstlisting}