alltt 内的 Pageref

alltt 内的 Pageref

下面是显示错误的最小工作示例:

\documentclass[a4paper,12pt,openany]{book}
\usepackage{alltt}

\begin{document}
\begin{alltt}
    \pageref{asd fgh jkl}
\end{alltt}
\end{document}

我期望输出是

??

相反,我得到的是

?? fgh jkl

只要参数中没有空格,\pageref 就可以正常工作。如果有空格,则除第一个单词之外的所有单词也会输出。我该如何防止这种情况发生?谢谢。

答案1

这是标签中不使用空格的另一个好理由。但是,强制使用“真实空格”是可行的:

\documentclass[a4paper,12pt,openany]{book}
\usepackage{alltt}

\begin{document}
\begin{alltt}
    \pageref{asd\string fgh\string jkl}
\end{alltt}
\label{asd fgh jkl}
\end{document}

替代方法:

\documentclass[a4paper,12pt,openany]{book}
\usepackage{alltt}
\newcommand{\ttpageref}{\begingroup\catcode`\ =10 \ttpagerefaux}
\newcommand{\ttpagerefaux}[1]{\pageref{#1}\endgroup}

\begin{document}
\begin{alltt}
\ttpageref{asd fgh jkl}
\end{alltt}
\label{asd fgh jkl}
\end{document}

您也可以\pageref直接使用,但设置更复杂:

\documentclass[a4paper,12pt,openany]{book}
\usepackage{alltt}
\let\latexpageref\pageref
\newcommand{\ttpageref}{\begingroup\catcode`\ =10 \ttpagerefaux}
\newcommand{\ttpagerefaux}[1]{\latexpageref{#1}\endgroup}
\usepackage{etoolbox}
\AtBeginEnvironment{alltt}{\let\pageref\ttpageref}

\begin{document}
\begin{alltt}
\pageref{asd fgh jkl}
\end{alltt}
\label{asd fgh jkl}
\end{document}

答案2

您可能不仅会得到所述的输出,还会得到错误

! Missing \endcsname inserted.

避免这种情况的最简单方法是将引用隐藏在临时宏中,或者如果你愿意,你可以使用\string

\documentclass[a4paper,12pt,openany]{book}
\usepackage{alltt}

\begin{document}
\label{asd fgh jkl}
\def\foo{\pageref{asd fgh jkl}}
\begin{alltt}

    \foo

    \pageref{asd\string fgh\string jkl}

\end{alltt}
\end{document}

相关内容