通过直接命令引用 bibitem,而不是通过 \cite

通过直接命令引用 bibitem,而不是通过 \cite

由于某种原因,我需要\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

除了制作atletter您还需要对 进行相同的操作_

\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}

相关内容