
這是今天的奇怪錯誤。上週末為了“好玩”,我玩了 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
請注意UTF8 中的LastChangedDate
包含方式。sø
我通常在採用英語設定的 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 用戶輸入一樣,正確的方法是使用\protected@...
等效的LaTeX 內核
\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
.