假设 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}