如何创建一个新命令,其单个参数能够同时应用于 `lstinputlisting` 的“caption”和“path”参数

如何创建一个新命令,其单个参数能够同时应用于 `lstinputlisting` 的“caption”和“path”参数

我想创建一个命令来简化使用包列表中的命令lstinputlisting,它可以接受单个参数作为文件路径,并将其传递给 lstinputlisting 的标题和路径参数。总之,使用文件路径作为标题。

考虑以下 LaTeX 源:

\documentclass[UTF8]{ctexart}
\usepackage{listings}

\newcommand{\myincludecode}[1]{\lstinputlisting[caption=#1, language=matlab]{#1}}
\newcommand{\mysecondincludecode}[2]{\lstinputlisting[caption={#2}, language=matlab]{#1}}


\begin{document}

\myincludecode{main.m}                        % line 10
\myincludecode{gen_data.m}                    % line 11

\mysecondincludecode{main.m}{main.m}          % line 13
\mysecondincludecode{gen_data.m}{gen\_data.m} % line 14

\end{document}

显然,第 13 行和第 14 行的命令运行良好,既正确地包含了相应的文件,又打印了相应的标题。

第 10 行也运行正常。但是,第 11 行包含相应文件,但没有输出任何标题。日志文件显示:

Try.tex|11 error| Missing $ inserted.
Try.tex|11 error| Extra }, or forgotten $.
Try.tex|11 error| Missing $ inserted.
Try.tex|11 error| Missing } inserted.

很明显,下划线破坏了我的命令。所以,我想知道如何修改myincludecode才能让它工作——即使遇到一些特殊字符,比如这里的下划线。

答案1

对论点进行去标记化:

\documentclass[UTF8]{ctexart}
\usepackage[T1]{fontenc}
\usepackage{listings}

\newcommand{\myincludecode}[1]{\lstinputlisting[caption=\detokenize{#1}, language=matlab]{#1}}

\begin{document}

\myincludecode{main.m}
\myincludecode{gen_data.m} 

\end{document}

在此处输入图片描述

答案2

下划线mathmode有一个函数。它将下一个字符更改为下标。因此它需要一个$符号。这是解决您问题的一个简单方法。

\documentclass[UTF8]{ctexart}
\usepackage{listings}

\begin{document}
\begingroup
\newcommand{\myincludecode}[1]{\catcode`_=11\lstinputlisting[caption=#1, language=matlab]{#1}}
\myincludecode{main.m}
\myincludecode{gen_data.m}
\endgroup
$1_2$
\end{document}

Catcode 表示类别代码。类别为_8,它指定了一些功能,如果我将其更改为 11,它会将下划线更改为字母类别,这可能就是您想要的。在\begingroup&之间添加此命令\endgroup会使下标函数在其范围之外保持完整。

答案3

您必须避免在文件名和引用或引用标签中使用“_”,或者您必须使用带有活动字符控件的 babel 包,或者您必须提供 [strings] 选项,该选项会尝试重新定义几个命令(并且可能无法完美运行)。即使没有 [strings] 选项或 babel,您也可以偶尔使用下划线,例如:“\include{file\string_name}”。

默认操作非常简单,无需自定义;但您必须避免在 LaTeX 将参数用作某些控制函数的字符串或名称的任何地方使用“_”。这些包括 \cite 和 \ref 的标签、\input、\include 和 \includegraphics 的文件名、环境名称、计数器名称和放置参数(如 [t])。这些上下文的问题在于它们是“移动参数”,但 LaTeX 不会为它们“打开”“\protect 机制”。

如果您需要在这些位置使用下划线字符,则可以使用软件包选项 [strings] 来重新定义采用此类字符串参数的命令,以便应用保护(将 \protect 设置为 \string)。此规定影响的命令列表在 \UnderscoreCommands 中给出,每个命令前都有 \do;另外还有几个其他命令,包括 \input、\includegraphics、\cite、\ref 及其变体。

请参见 - http://ctan.imsc.res.in/macros/latex/contrib/underscore/underscore.pdf 和 - 列出名称/路径中带有下划线的文件

在此处输入图片描述 在此处输入图片描述

相关内容