当我尝试使用 时texdef
,我得到了以下错误,尽管texdef
它与 TeX Live 2016 冻结时的情况相同,而且实际上与几年来的情况相同,因为它的日期是 2011-2012。为什么我现在会收到错误?我该怎么办?
texdef --help
Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/^\\\@protected\@testopt { <-- HERE ?\\.*? }? *(\\\\.*?) / at /usr/local/texlive/bin/texdef line 391.
我记得以前好像有投诉,但还是管用。不过我不太确定。
答案1
需要在指示的位置更新 perl 代码(第 391 行和第 394 行以使用\{
而\}
不是{
}
elsif ($macrodef =~ /^\\\@protected\@testopt \{?\\.*? \}? *(\\\\.*?) /) {
unshift @cmds, $1;
}
elsif ($macrodef =~ /^\\\@testopt \{?(\\.*?) \}?/) {
这应该被报告为 texdef 中的一个错误
答案2
如果您使用 Linux 发行版分发的软件包安装 TeX Live,或者您是 Windows 用户,或者执行此操作需要 root 权限并且您不确定自己在做什么,请不要使用此解决方案。
这仅仅是大卫的回答以补丁的形式以便于应用,因为这似乎不太可能很快得到更新,并且更新 TeX Live 会覆盖对原始文件的更正。
--- 2017/texmf-dist/scripts/texdef/texdef.pl.orig 2016-11-25 18:32:54.000000000 +0000
+++ 2017/texmf-dist/scripts/texdef/texdef.pl 2017-08-27 22:49:49.052819126 +0100
@@ -388,10 +388,10 @@
my $protectedmacro = $2;
unshift @cmds, $protectedmacro;
}
- elsif ($macrodef =~ /^\\\@protected\@testopt {?\\.*? }? *(\\\\.*?) /) {
+ elsif ($macrodef =~ /^\\\@protected\@testopt \{?\\.*? \}? *(\\\\.*?) /) {
unshift @cmds, $1;
}
- elsif ($macrodef =~ /^\\\@testopt {?(\\.*?) }?/) {
+ elsif ($macrodef =~ /^\\\@testopt \{?(\\.*?) \}?/) {
unshift @cmds, $1;
}
}
@@ -679,7 +679,7 @@
| (?:new|renew|provide)robustcmd\s* \*? \s* {? \s* \\ # etoolbox definitions
| (?:new(?:box|count|dimen|if|insert|read|skip|muskip|toks|write)) \s* \\ # TeX registers etc.
| (?:char|count|dimen|mathchar|skip|toks)def \s* \\ # TeX chardefs etc.
- | \@namedef{? # Definition by name only
+ | \@namedef\{? # Definition by name only
| Declare[a-zA-z]+ \s* \*? \s* {? \s* \\ # Declare... definitions
| declare[a-zA-z]+ \s* \*? \s* {? \s* \\ # declare... definitions
)
将文件另存为,例如texdef.patch
。
假设你在 Unix-ish 系统的默认位置从上游安装了 TeX Live,因此它texdef.pl
位于,通过导航到你保存文件的目录/usr/local/texlive/2017/texmf-dist/scripts/texdef/texdef.pl
将补丁文件放入其中。/usr/local/texlive
mv texdef.patch /usr/local/texlive
然后使用
cd /usr/local/texlive
patch -b -p0 <texdef.patch
如果您使用 root 权限安装了 TeX Live,则需要su
或使用sudo
。如果您以自己的身份安装,则不需要任何东西。如果您以用户身份安装texlive
(如我的以无权限用户身份安装且无权访问自己家的说明中所述),则需要su texlive
。
该-b
标志指示patch
在修补之前备份文件,patch
除非它能找到与搜索文本的良好匹配,否则不会触碰文件。所以这应该是相对安全的。最坏的情况是,它应该什么都做不了。但是,你以 root 身份执行的任何操作都只有你这样做才安全,所以除非你确信你不会做任何太灾难性的事情,否则我不会以 root 身份执行此操作。