打印包含下划线的文件名

打印包含下划线的文件名

我正在使用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 改为其他字符,而不是字母,因为这不会改变控制序列允许的字符。否则,如果您_在控制序列后面直接有一个,它会突然成为控制序列名称的一部分,这很可能不是人们想要的。

相关内容