如何在子文件中使用 \lstdefinestyle?

如何在子文件中使用 \lstdefinestyle?

假设 main.tex 是我编译的主要 latex 文件。其余文件(作为 sub.tex)包含定义文件列表,以便排列每个章节、子章节等。如何在子 tex 文件中使用 main.tex 中定义的样式?

下面的例子不起作用。但是,如果我将 sub.text 的全部内容复制到 main.text 中,则不会出现问题。不知何故,CStyle在 sub.tex 中检测不到。有什么建议吗?谢谢

主文本

\lstdefinestyle{CStyle}{
    backgroundcolor=\color{backgroundColour},   
    commentstyle=\color{mGreen},
    keywordstyle=\color{magenta},
    numberstyle=\tiny\color{mGray},
    ...
}
\input{sub.tex}
\begin{document}
    \callDefined{}
\end{document}

亚特克斯

\def\callDefined{
    \begin{lstlisting}[style=CStyle]
            uint8_t a = 0xAB;
    \end{lstlisting}
}

答案1

您不能lstlisting在宏定义中使用环境/将\def其作为定义文本的组成部分。

这是因为lstlisting环境希望通过在类别代码制度暂时更改时从 .tex 文件中读取和标记内容来获取属于它的标记,而不是通过在传递宏标记的替换文本的过程中插入标记,从而在执行定义该宏\def标记的指令时,该替换文本在未改变的类别代码制度下得到标记。

lstlisting但是,当-environment 不在里面时,下面的代码\def确实有效:

亚特克斯

\begin{lstlisting}[style=CStyle]
uint8_t a = 0xAB;
\end{lstlisting}

测试.tex

\documentclass{article}
\usepackage{color}
\definecolor{backgroundColour}{RGB}{255,240,245}
\usepackage{listings}
\lstdefinestyle{CStyle}{
    backgroundcolor=\color{backgroundColour},   
    commentstyle=\color{mGreen},
    keywordstyle=\color{magenta},
    numberstyle=\tiny\color{mGray},
}
\begin{document}
\input{sub.tex}
\end{document}

在此处输入图片描述


或者,\def您可以实现自己的定义命令,该命令会读取 verbatim-catcode-régime 中的定义文本,并定义命令以将在 verbatim-catcode-régime 中读取的内容传递给\scantokens。您需要一些\newlinechar=\endlinechar技巧才能正确换行。您需要在传递给的内容末尾插入注释字符,\scantokens以确保由\scantokens-routine 插入的最后一个结束符不会产生不需要的空行。可能看起来像以下示例。请注意,lstlistings-environments 中的缩进以及第二个参数中的缩进\MyDefVerbatim发生在亚特克斯确实很重要。

亚特克斯

\MyDefVerbatim\callDefined{%
\begin{lstlisting}[style=CStyle]
uint7_t a = 0xAB;
 uint8_t a = 0xAB;
  uint9_t a = 0xAB;
\end{lstlisting}
}%

主文本

% With TeXLive 2020 and newer, the xparse-package doesn't need to be
% loaded explicitly as most of its features are integrated into the
% LaTeX 2e-kernel. 
% With TeXLive 2019 and older, the xparse-package needs to be
% loaded explicitly.
% Seems currently (Novemer 16, 2021) overleaf uses
% TeXLive 2019 (legacy) by default.
\RequirePackage{xparse}

\NewDocumentCommand\MyDefVerbatim{m}{%
  \begingroup\catcode`\^^I=12 \innderdefineverbatim{#1}%
}%
\begingroup\catcode`\^^A=14 \catcode`\%=12 \csname @firstofone\endcsname{^^A
  \endgroup
  \NewDocumentCommand\innderdefineverbatim{m+v}{^^A
     \endgroup
     \NewDocumentCommand{#1}{}{^^A
       \begingroup\newlinechar=\endlinechar\scantokens{\endgroup#2%}^^A
     }^^A
  }^^A
}%

\documentclass{article}
\usepackage{color}
\definecolor{backgroundColour}{RGB}{255,240,245}
\usepackage{listings}
\lstdefinestyle{CStyle}{
    backgroundcolor=\color{backgroundColour},   
    commentstyle=\color{mGreen},
    keywordstyle=\color{magenta},
    numberstyle=\tiny\color{mGray},
}
\input{sub.tex}
\begin{document}
\callDefined
\end{document}

在此处输入图片描述

相关内容