我在 LaTeX 文档中放入了一个 subversion 关键字字符串。它看起来像:
$LastChangedDate: 2011-01-16 18:09:33 +0100 (nie) $
每次我向存储库提交时,它都会被替换(简单的文本替换)。此外,当我获得文档的旧版本时,日期也会恢复到提交该版本的时间。
我想让它在输出中看起来更漂亮,所以决定做出以下定义:
\def\LastChangedDate: #1-#2-#3 #4:#5:#6 #7 (#8) {\year=#1\month=#2\day=#3\date{\today{} #4:#5}}
\newenvironment{subversionparse}{\catcode`$=0}{\catcode`$=3}
\begin{subversionparse}
$LastChangedDate: 2011-01-16 18:09:33 +0100 (nie) $
\end{subversionparse}
首先,它定义了LastChangedDate
一个宏,该宏解析以下文本并将日期设置为 TeX“今天”日期,然后将 \date 定义为“今天”后跟时间。这使得输出很好地本地化,在我的例子中是:“16 stycznia 2011 18:09”。
然后创建一个新环境来临时将$
字符更改为转义字符,以便$LastChangedDate
将其解析为真正的宏。
现在,我很高兴我成功实现了这个功能。你认为这种方法有什么潜在问题?也许还有其他更简单的方法可以做同样的事情?
答案1
您不应手动将 catcode 重新设置为$
3,因为您不知道它是否一开始就是 3。(至少,onlyamsmath 和 nag 设置$
为 active,并且 pgf 也执行花哨的操作,尽管 pgf 可能仅在本地执行此操作。)让 \endgroup 处理它:catcode 分配是本地的。
根据记忆,使用分隔参数的安全方法应该是:
\def\svnparse{\def\svnp@rse $##1${\svnp@rs@ #1\@nil}\svnp@rse}
使用\svnp@rs@
与您的代码类似的分隔参数。关键是\svnp@rse
在运行时重新定义,这样您就可以选择当前活动的 catcode $
(除非我们已经处于参数中)。进一步的间接操作只是为了确保第三方仍然可以挂接或修补您的命令。
顺便说一句,重置转义字符的用法很巧妙!向你致敬!
答案2
也许您可以尝试svn
(或svn-multi
,,svn-info
等等)包。
http://www.ctan.org/tex-archive/help/Catalogue/entries/svn.html
答案3
您可以使用我的“svn-多“ 包裹:
\svnid{$Id$}
\date{\svntoday \svnhour:\svnminute}
它为您完成所有 catcode 魔法,并且还可以与多个源文件一起使用,例如包含文件。
答案4
这VC 包有一种简洁的方式来包含此类修订信息。由于格式化是由awk
脚本完成的,因此很容易对其进行操作,为您提供自定义格式等。