svn 和标题冲突?

svn 和标题冲突?

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_sizetexmf.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}

到目前为止它是有效的,但我不知道它是否有任何副作用或者是否是不好的做法。

相关内容