由于某种原因,我需要\bibitem{name}
通过某些命令直接引用在中声明的名称,而不是通过\cite
。似乎可以通过标签\b@name
(由\makeaatletter
和包围)来实现。但是,当包含一些特殊字符(如)时,\makeatother
它不起作用,这些字符在 bibitem 名称中是允许的,可以通过引用。这里有一个小例子。name
_
\cite
\documentclass{book}
\begin{document}
\makeatletter[\b@Name,\b@NameOne,\b@NameTwo]\makeatother %works
\cite{Name_} %works
\makeatletter[\b@Name_]\makeatother %does not work
\begin{thebibliography}{1}
\bibitem{Name}
\bibitem{Name_}
\bibitem{NameOne}
\bibitem{NameTwo}
\end{thebibliography}
\end{document}
我几乎可以肯定 LaTeX 生成的Name_
命令比 更复杂\b@Name_
,因为_
它具有特殊含义(数学模式中的子索引)。我尝试猜测 的命令Name_
,也使用了“tracingmacros”,但没有成功。
那么,问题是:如何确定\b@Name
带有下划线的名称的命令_
?
提前致谢
答案1
这也将在第一次编译时起作用(当命令尚未在辅助文件中且未定义时。\UseName
需要相当新的 LaTeX。在旧系统中,您可以使用\csname b@Name\endcsname
。
\documentclass{book}
\begin{document}
\UseName{b@Name}, \UseName{b@NameOne},
\UseName{b@NameTwo}, \UseName{b@Name_}
\begin{thebibliography}{1}
\bibitem{Name}
\bibitem{Name_}
\bibitem{NameOne}
\bibitem{NameTwo}
\end{thebibliography}
\end{document}
答案2
除了制作at
,letter
您还需要对 进行相同的操作_
:
\catcode`\_11
完整示例(其中我使用{
组}
来恢复_
):
\documentclass{book}
%\documentclass{article}
\begin{document}
\makeatletter[\b@Name,\b@NameOne,\b@NameTwo]\makeatother %works
cite: \cite{Name_} %works
The solution:
{\makeatletter\catcode`\_11 [\b@Name_]}% precent here kills the space, do you want a space here?
\begin{thebibliography}{1}
\bibitem{Name}
\bibitem{Name_}
\bibitem{NameOne}
\bibitem{NameTwo}
\end{thebibliography}
\end{document}