使用 \lstinputlisting 时,将 lstlisting 中的一行加粗

使用 \lstinputlisting 时,将 lstlisting 中的一行加粗

这个答案显示了如何将 中的一行lstlisting设置为粗体。但是,在此解决方案中,您需要将材料放在lstlisting环境中。

但是如果我需要使用 输入行怎么办\lstinputlisting? 在这种情况下我该怎么办?

编辑输入文件不是一种选择。此文件是机器生成的,可能会不时更改。但要加粗的行的行号不会改变。

虽然我们不需要 MWE,但我提供了一个,以便您可以以最少的麻烦提供解决方案。


\documentclass{article}

\usepackage{filecontents}

\begin{filecontents*}{\jobname.txt}
First
Second
Third line to be bolded.
Fourth
\end{filecontents*}

\usepackage{listings}

\begin{document}

\lstinputlisting{\jobname.txt}

\end{document}

答案1

listings有很多钩子你可以(滥用)使用,例如这里 OutputBox,它在每行的开头被调用(可能在排版行号之后)。

钩子的添加是全局的,因此如果您想限制范围,请使用宏并根据需要重新定义它:

\documentclass{article}
\usepackage{listings}

\makeatletter
\lst@AddToHook{OutputBox}{\lst@boldline}
\let\lst@boldline\relax
\newcommand\lstboldline[1][3]{% optional argument to choose the line number?
    \def\lst@boldline{\ifnum\lst@lineno=#1 \bfseries\fi}}
\newcommand\lstnoboldline{\let\lst@boldline\relax}
\makeatother

\begin{document}
\lstboldline
\lstinputlisting{\jobname.txt}

\lstnoboldline
\lstinputlisting{\jobname.txt}

\lstboldline[2]
\lstinputlisting{\jobname.txt}
\end{document}

输出

答案2

我的方法:

  • 你可以使用下面这个命令逐行读取文件回答从文件中读取任意行
  • 使用 for 循环和 if 条件来调整指定行以适应使其加粗
  • 使用以下方式编写每一行\immediate\write\tempfile{...}
  • 用于\lstinputlisting[escapeinside={(*}{*)}]{\jobname.tmp}显示适配的代码

为此我发出了命令boldlineCode{<number of lines>}{<bold line>}

\documentclass{article}

\usepackage{filecontents}

\begin{filecontents*}{\jobname.txt}
First
Second
Third line to be bolded.
Fourth
\end{filecontents*}

\usepackage{listings}
\usepackage{forloop}
\usepackage{ifthen}

\newcounter{ct}

% boldlineCode
% #1 = number of lines
% #2 = bold line
\newcommand{\boldlineCode}[2]{
    \newwrite\tempfile
    \immediate\openout\tempfile=\jobname.tmp
    \newread\myread
    \openin\myread=\jobname.txt
    % read lines, insert bold command in line #2 and write
    \forloop{ct}{1}{\numexpr\value{ct}-1 < #1}%
    {%
        \read\myread to \command
        \ifthenelse{\value{ct}=#2}{
            \immediate\write\tempfile{(*\unexpanded{\bfseries} \command*)}
        }{
            \immediate\write\tempfile{\command}
        }
    }
    \immediate\closeout\tempfile
    \lstinputlisting[escapeinside={(*}{*)}]{\jobname.tmp}
}

\begin{document}

\boldlineCode{4}{3}

\boldlineCode{4}{2}

\end{document}

在此处输入图片描述

相关内容