这是今天的奇怪错误。上周末,为了“好玩”,我玩了 Win 8 和 TortoiseSVN。提交后,我的 LaTeX 项目突然无法编译。
我选择以下 MWE 组合
主文件:
\documentclass[a4paper]{memoir}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\makepagestyle{test}
\makeoddfoot{test}{}{\sffamily\thepage}{}
\pagestyle{test}
\usepackage[filehooks]{svn-multi}
\usepackage[colorlinks]{hyperref}
\begin{document}
Test
\input{test2}
\end{document}
test2.tex
\svnidlong
{$HeadURL: https://url $}
{$LastChangedDate: 2015-07-26 15:59:20 +0200 (sø, 26 Jul 2015) $}
{$LastChangedRevision: 1 $}
{$LastChangedBy: daleif $}
\chapter{test}
test
注意LastChangedDate
包含的内容sø
是 UTF8。我通常在使用英语设置的 Linux 上工作,因此在其他地方该部分将是Sun
(ascii)
以下是我的观察
我得到了错误
./test2.tex:8: Undefined control sequence.
GenericError ...
#4 errhelp @err@ ...
l.8 \chapter
{test}
- 如果我删除
ø
MWE 编译 - 我
\sffamily
从页脚中删除了它编译 - 如果我删除
hyperref
它编译 - 如果我
filehooks
从中删除选项svn-multi
,它会编译
知道发生什么事了吗?
(一个可行的解决方案是解释如何告诉 TortoiseSVN 始终使用英语,sø
这是丹麦语 søndag(星期日)的缩写)
答案1
这是一个经典的“ \edef
(或类似)应用于脆弱的用户输入”问题:如果在尝试应用该标记的任何部分中有一个“不安全”标记,则\xdef
其中\svn@pushfilestack
的“不安全”标记会失败。与任何 LaTeX2e 用户输入一样,正确的方法是使用 LaTeX 内核\protected@...
等效项
\documentclass[a4paper]{memoir}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\makepagestyle{test}
\makeoddfoot{test}{}{\sffamily\thepage}{}
\pagestyle{test}
\usepackage[filehooks]{svn-multi}
\usepackage{xpatch}
\makeatletter
\xpatchcmd\svn@pushfilestack{\xdef}{\protected@xdef}{}{}
\makeatother
\usepackage[colorlinks]{hyperref}
\begin{document}
\input{test2}
\end{document}
理想情况下,这个问题应该在 中得到修复svn-multi
。