尝试使用 texdef 时,如何避免此正则表达式错误?

尝试使用 texdef 时,如何避免此正则表达式错误?

当我尝试使用 时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 身份执行此操作。

相关内容