解释

解释

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宏,即它的定义方式。与\protected 版本相比:

\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的精彩且有用的评论:)

相关内容