我想创建一个命令来简化使用包列表中的命令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
答案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 和 - 列出名称/路径中带有下划线的文件