svn
不知何故,软件包和软件包之间发生了奇怪的冲突titling
。以下代码在 TeXLive 2010 上出现错误(但在我的工作计算机上的旧 TeX 发行版上,它可以正常编译)。
\documentclass{article}
\usepackage{titling}
\usepackage{svn}
\SVN $Date: 2011-05-06 20:57:26 +0100 (Fri, 06 May 2011) $
\date{\SVNDate}
\title{tesT}
\author{Test}
\begin{document}
\maketitle
\end{document}
当我尝试构建它时,我遇到了输入堆栈大小的问题
This is pdfTeX, Version 3.1415926-1.40.11 (TeX Live 2010)
restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2009/09/24>
Babel <v3.8l> and hyphenation patterns for english, dumylang, nohyphenation, pi
nyin, bulgarian, russian, ukrainian, ukenglish, usenglishmax, basque, french, l
oaded.
(/usr/share/texmf-dist/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/usr/share/texmf-dist/tex/latex/base/size10.clo))
(/usr/share/texmf-dist/tex/latex/titling/titling.sty)
(/usr/share/texmf-dist/tex/latex/svn/svn.sty)
! TeX capacity exceeded, sorry [input stack size=5000].
\GenericError ->\protect
\GenericError
l.6 \date{\SVNDate}
! ==> Fatal error occurred, no output PDF file produced!
Transcript written on test.log.
如果
- 我不使用该
titling
套餐 - 如果我实际上没有使用真正的 SVN 日期。也就是说,如果 SVN 行被替换为
\SVN $Date$
有什么想法吗?我还应该添加更多信息吗?(我也不确定这个问题该用什么标签。)
编辑如果我增加stack_size
texmf.cnf 中的,错误将变成
! TeX capacity exceeded, sorry [parameter stack size=14000].
\PackageError #1#2#3->
\GenericError {(#1)\@spaces \@spaces \@spaces \@spaces...
l.6 \date{\SVNDate}
答案1
正如svn
手册第 2.5 节所述已知的问题更改其格式的灵活性\SVNDate
,例如当语言更改时,不允许在扩展上下文(例如\edef
)中使用它。因此,它被定义为在内部使用时创建错误消息\edef
。我个人不确定这是否是一个明智的设计决定。定义\SVNDate
为一个健壮的宏会是一个更好的主意。现在titling
包使用\protected@xdef
似乎在扩展错误消息时导致无限循环。
可以通过确保\SVNDate
不会被 扩展来避免此错误。这可以通过通常的、普通的\date
来实现,或者,如果更经常需要这样做,则通过重新定义来使其更强大:\protect
\noexpand
\SVNDate
\date{\noexpand\SVNDate}
% or
\date{\protect\SVNDate}
% or
\usepackage{etoolbox}
\robustify\SVNDate
\date{\SVNDate}
% or
\protected\expandafter\def\expandafter\SVNDate\expandafter{\SVNDate}
\date{\SVNDate}
答案2
问题在于titling
重新定义\date
以便可以再次使用。重新定义在以下代码中:
\appendiargdef{\date}{%
\begingroup
\renewcommand{\thanks}[1]{}
\renewcommand{\thanksmark}[1]{}
\renewcommand{\thanksgap}[1]{}
\protected@xdef\thedate{#1}
\endgroup}
作为一种解决方法,您可以注释掉此代码,但您会失去日期的重用权。)
也许有人比我更有知识,可以提出一个实际的解决方案。
答案3
\date
经过更多的实验,显然一个足够的解决方法是保护新命令的参数
\date{\protect\SVNDate}
到目前为止它是有效的,但我不知道它是否有任何副作用或者是否是不好的做法。