我正在使用pdfpages
包将一些文件包含到大文件中。我想打印文件名,转到新页面并包含文件。问题是当文件名包含_
LaTeX 时会出现错误missing $ inserted
(_
我猜是因为只允许在数学模式下使用)。我该如何处理?
使用类似方法\def_\_
没有帮助。我也尝试了此站点上的一些解决方案,但没有得到任何结果。
以下是 MWE:
\documentclass{scrartcl}
\usepackage{pdfpages}
\newcommand{\INC}[1]{%
\vspace*{\fill}
\begin{center}
\large #1
\end{center}
\vspace*{\fill}
\newpage
\includepdf[pages=-,nup=1x2,doublepages=true,landscape,frame=true]{#1}
}
\begin{document}
\INC{file_name.pdf}
\end{document}
答案1
使用\detokenize
:
\documentclass{scrartcl}
\usepackage{pdfpages}
\newcommand{\INC}[1]{%
\vspace*{\fill}
\begin{center}
\large\ttfamily\detokenize{#1}
\end{center}
\vspace*{\fill}
\newpage
\includepdf[pages=-,nup=1x2,doublepages=true,landscape,frame=true]{#1}
}
\begin{document}
\INC{file_name.pdf}
\end{document}
如果要使用文本字体,请删除\ttfamily
并添加
\usepackage[T1]{fontenc}
在序言中。
替代方法(由 daleif 建议):使用url
。
\documentclass{scrartcl}
\usepackage{pdfpages,url}
\DeclareUrlCommand{\filename}{\urlstyle{rm}}% or \urlstyle{tt}
\newcommand{\INC}[1]{%
\vspace*{\fill}
\begin{center}
\large\filename{#1}
\end{center}
\vspace*{\fill}
\newpage
\includepdf[pages=-,nup=1x2,doublepages=true,landscape,frame=true]{#1}
}
\begin{document}
\INC{file_name.pdf}
\end{document}
答案2
egreg 已经给出了一个可能更好的答案。但是既然你在问题中提到了这一点,我想补充几句关于重新定义的话_
。
在 TeX 中每个字符都有一个catcode(类别代码)._
默认有 catcode 8(下标)。\def
可以定义
- 控制序列(以转义符开头,由一个或多个字母字符组成)
- 控制字符(以转义字符开头,且由一个非字母字符组成)
- 活动字符(恰好是 catcode 13 中的一个字符,没有转义字符)
(顺便说一下,空格仅在控制序列之后被吞噬,而不是在控制字符或活动字符之后。)
因此,如果您想重新定义,_
您首先需要使其活跃:
\catcode`_=\active
\def_{\_}
然而,人们不想全局改变 catcode,因为这样_
可能会(取决于它的定义)在其他地方引起很多麻烦,例如在数学模式下当人们想要使用下标时。
当 TeX 第一次读取一个字符时,它会创建一个由字符代码和类别代码组成的 token。token 的类别代码可以不是稍后更改。可以定义一个宏来更改 catcode,然后调用另一个宏来读取一些参数,然后将 catcode 改回来。如果尝试在“真实”宏内更改 catcode,那就太晚了,因为那时参数已经被读入并转换为标记。
\documentclass{article}
\usepackage{pdfpages}
% save the orginial _ for \includepdf
\def\originalunderscore{_}
\makeatletter
% make _ active so that I can use \def_ in the replacement text
\catcode`_=\active
\newcommand{\INC}{%
% start a new group to keep catcode changes local
\begingroup
% change catcode of _ to active in argument of \@doINC (this does not affect the catcode of _ in the replacement text of \@doINC because that is fixed when it is defined, not when it is used)
\catcode`_=\active
\@doINC
}
\newcommand{\@doINC}[1]{%
\vspace*{\fill}
\begin{center}
\def_{\_}%
\large #1%
\end{center}
\vspace*{\fill}
\newpage
\def_{\originalunderscore}%
\includepdf[pages=-,nup=1x2,doublepages=true,landscape,frame=true]{#1}
% I am closing the group at the end instead of at the beginning to keep redefinitions of _ local (this makes no difference for the catcodes because they are fixed by the time this code is executed.)
\endgroup
}
\makeatother
\catcode`_=8
\begin{document}
\INC{file_name.pdf}
$q_0$
\end{document}
请注意,此宏不能用作另一个宏的参数,因为它无法再更改 catcodes。
\makeatletter
并\makeatother
改变 catcode @
- 这是 LaTeX 定义私有宏的方式。
但无需重新定义_
。将 catcode 更改为其他代码可以让事情变得更容易:
\documentclass{article}
\usepackage{pdfpages}
\makeatletter
\newcommand{\INC}{%
% start a new group to keep catcode changes local
\begingroup
% change catcode of _ to other in argument of \@doINC
\catcode`_=12\relax
\@doINC
}
\newcommand{\@doINC}[1]{%
\endgroup
\vspace*{\fill}
\begin{center}
\texttt{\large #1}%
\end{center}
\vspace*{\fill}
\newpage
\includepdf[pages=-,nup=1x2,doublepages=true,landscape,frame=true]{#1}
}
\makeatother
\begin{document}
\INC{file_name.pdf}
$q_0$
\end{document}
由于历史原因,TeX 的默认字体不是在“普通”字体有符号的地方有一个_
符号。因此,有必要用这种方法更改字体。在这个例子中,我把它改成了打字机字体。如果你正在使用以下软件包——我建议德语文件——那不是必需的。
\usepackage[ngerman]{babel}% neue deutsche Rechtschreibung
\usepackage[utf8]{inputenc}% Ermöglicht direkte Eingabe von Umlauten.
\usepackage[T1]{fontenc}% Ermöglicht Silbentrennung von Wörtern mit Umlauten, Kopieren von Umlauten und Verwendung von Sonderzeichen wie <, >, |.
\usepackage{lmodern}% Ändert Schriftart weil die Standardschrift von T1 unschön ist und Ligaturen nicht kopiert werden könnten.
我已将 catcode 改为其他字符,而不是字母,因为这不会改变控制序列允许的字符。否则,如果您_
在控制序列后面直接有一个,它会突然成为控制序列名称的一部分,这很可能不是人们想要的。