我尝试使用pdflatex
来输入一些在 中有下划线的文件\label
。例如 和\label{abc_xyz}
,但一直没有成功。我不断收到以下错误:
! Missing \endcsname inserted.
<to be read again>
\protect
梅威瑟:
\documentclass[twoside]{article}
\def\itt{\tt #1}
\def\litt#1{\tt #1\label{#1}}
\begin{document}
\itt{pqr_mno}
\litt{abc_xyz}
\litt{xyz_abc}
\end{document}
我做了几次更改,但都失败了。如能得到任何帮助,我将不胜感激
答案1
\label
通常,如果在或内部使用下划线及其标准 catcode“下标”(8),则不会引起问题\ref
:
\documentclass{article}
\begin{document}
\section{Hello World}
\label{sec_hello}
See section \ref{sec_hello}.
\end{document}
包的简写babel
也不是问题,因为babel
修补了\label
/\ref
系统以添加对简写的支持。
活动下划线
可能你正在使用一个使下划线活跃的包。然后它变得更加复杂。一种解决方法是\string
使活动下划线表现为正常字符:
\label{sec\string_hello}
\ref{sec\string_hello}
标签名称也会写入.aux
文件中,并在文档末尾再次读取。这里应该恢复 catcode:
\usepackage{atveryend}
\AfterLastShipout{\catcode`\_=12\relax}
如果未知包在之前使下划线的 catcode 处于活动状态,则在序言末尾\begin{document}
读取文件时它应该处于非活动状态。.aux
\ifnum\catcode`\_=\active
\catcode`\_=12\relax
\AtBeginDocument{\catcode`\_=\active}%
\fi
完整示例:
\documentclass{article}
\catcode`\_=\active
\def_{\textunderscore}
\usepackage{atveryend}
\AfterLastShipout{\catcode`\_=12\relax}
\ifnum\catcode`\_=\active
\catcode`\_=12\relax
\AtBeginDocument{\catcode`\_=\active}%
\fi
\begin{document}
\section{Hello World}
\label{sec\string_hello}
See section \ref{sec\string_hello}.
\end{document}
包裹underscore
根据激活下划线的包、激活范围和下划线的定义,可能会有更舒适的方式。例如,包underscore
激活下划线,这会破坏引用系统。但包支持babel
。下划线表现为简写,如果加载了 babel,则受支持:
\documentclass{article}
\usepackage[english]{babel}
\usepackage{underscore}
\begin{document}
\section{Hello World}
\label{sec_hello}
See section \ref{sec_hello}.
\end{document}