![解释](https://linux22.com/image/380063/%E8%A7%A3%E9%87%8A.png)
这bibleref
当在章节标题中调用引用时,包不起作用。引发以下错误:
Argument of \@sect has an extra }
标题内也一样。有人知道如何解决这个问题吗?
以下是 MWE:
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{bibleref}
\begin{document}
Here a reference in the text which works: \bibleverse{Gn}(1:1-3)
\section{Here a reference within a title: \bibleverse{Gn}(1:1-3) } % Don't work
\begin{table}
\caption{Here a reference within a caption: \bibleverse{Gn}(1:1-3) } % Don't work
\end{table}
\end{document}
答案1
你可以\protect
参考以下“特殊”的资料:
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{bibleref}
\begin{document}
Here a reference in the text which works: \bibleverse{Gn}(1:1-3)
\section{Here a reference within a title: \protect\bibleverse{Gn}(1:1-3) }
\begin{table}
\caption{Here a reference within a caption: \protect\bibleverse{Gn}(1:1-3) }
\end{table}
\end{document}
解释
因为已经有一个很好的、非常详细的答案这里(脆弱命令和坚固命令之间有什么区别?)@mpg,我会尝试给出一个不太详细但仍然有用的解释。在这个答案中,我尝试通过示例而不是完整的细节来看待它。如果您想了解更多详细信息,请阅读链接的答案,或随时提问。
这个问题很容易解决(如果你能找到它的话),但其根源有点技术性。通过观察编译时生成的辅助文件,可以更容易地查看问题。它包含例如章节名称和标题。这是必要的,因为您可能想要打印目录(或表格的表格),并且章节名称(或标题名称)也必须显示在其中。因此,这些章节和标题可以在同一文档的不同位置出现两次。这就是为什么人们称它们为“移动”命令。文本被复制/“移动”到文档中的另一个位置。
假设您的文档名为
doc.tex
,LaTeX 会写入一个名为 的文件doc.aux
。当 LaTeX 写入此文件时,它通常会扩展宏。如果你观察 的内容doc.aux
,你会看到发生了什么:
如果不\protect
输入宏,它包含
\relax
\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Here a reference within a caption: \let \@bv@restore \relax \def {}Genesis\let \let \let \let \def {\BRbookof }\def \BRbooknumberstyle \def {\BRepistletothe }\def \BRepistlenumberstyle \let \@@protect \let \@unexpandable@protect \afterassignment \let \@@protect \edef \BRbooktitlestyle {\BRbookof Genesis}{\BRbooktitlestyle {Genesis}}\let \let \let \let \let \reserved@d = (\def \par }}{1}}
\@writefile{toc}{\contentsline {section}{\numberline {1}Here a reference within a title: \let \@bv@restore \relax \def {}Genesis\let \let \let \let \def {\BRbookof }\def \BRbooknumberstyle \def {\BRepistletothe }\def \BRepistlenumberstyle \let \@@protect \let \@unexpandable@protect \afterassignment \let \@@protect \edef \BRbooktitlestyle {\BRbookof Genesis}{\BRbooktitlestyle {Genesis}}\let \let \let \let \let \reserved@d = (\def \par }{1}}
您在此处看到的“胡言乱语”是扩展的\bibleverse
宏,即它的定义方式。与\protect
ed 版本相比:
\relax
\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Here a reference within a caption: \bibleverse {Gn}(1:1-3) }}{1}}
\@writefile{toc}{\contentsline {section}{\numberline {1}Here a reference within a title: \bibleverse {Gn}(1:1-3) }{1}}
你可能会注意到,它\protect
确实做了它的名字所指的事情。它保护扩展中的以下宏。这是必需的,因为这个辅助文件会被再次读入以显示,例如目录。
简而言之,您需要保留原始宏而不进行扩展才能使其起作用。
强大的命令
正如@Mico 指出的那样,您可以采用不同的方法,而不是\bibleverse
在移动命令中保护每一个:使宏“健壮”。这实际上使宏“自我保护”,因此您无需手动处理它。
为了使宏更强大,您可以使用包\robustify{\macro}
提供的etoolbox
:
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{etoolbox} % provides the \robustify command
\usepackage{bibleref}
\robustify{\bibleverse} % makes \bibleverse work in sections and captions
\begin{document}
Here a reference in the text which works: \bibleverse{Gn}(1:1-3)
\section{Here a reference within a title: \bibleverse{Gn}(1:1-3) }
\begin{table}
\caption{Here a reference within a caption: \bibleverse{Gn}(1:1-3) }
\end{table}
\end{document}
这也行得通,而且您不必关注标题或章节中出现的每一个事件。您是否应该(频繁地)在章节标题中引用...嗯,那是另一个话题,但通过“强化”宏\bibleverse
,您可以自由地执行此操作,而不必
\protect
手动执行。
感谢@Mico的精彩且有用的评论:)