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}