我在文档开头无意中加了一个逗号。如果我注释掉babel
包或pst-infixplot
程序包,逗号就会消失。这是一个最简单的例子:
\documentclass{minimal}
\usepackage[T1]{fontenc}
\usepackage[latin5]{inputenc}
\usepackage[turkish,shorthands=off]{babel}
\usepackage{pstricks}
\usepackage{pst-infixplot}
\begin{document}
test
\end{document}
用任何语言替换[turkish]
或更改包的顺序都会导致同样的问题。
有什么解决办法吗?
答案1
该错误涉及文件第 477 行infix-RPN.tex
:
\let\@nil\relax
你可以像这样重现它:
\documentclass{article}
\usepackage[english]{babel}
\makeatletter
\let\@nil\relax
\makeatother
\begin{document}
test
\end{document}
(至于为什么它在与 babel 交互时会导致出现逗号,请参见文章底部)
具体来说,相关代码infix-RPN.tex
为
\let\@nil\relax
\def\compare@PS@operator#1,#2\@nil{%
\def\@tempa{#1}%
\def\@tempb{#2}%
\expandafter\ifx\csname op@token\current@cnt\endcsname\@tempa%
\advance\count1\@ne
\search@primary{\the\count1}{\the\count255}%
\advance\count1\m@ne
\@tokenuse{\the\count1}%
\fi
\ifx\@tempb\empty
\let\next\relax
\let\@tempb\relax
\else
\let\next\compare@PS@operator
\fi
\expandafter\next\@tempb\@nil
}
可以在加载包后将其添加到前言中,以修复由这些定义引起的错误pst-infixplot
。
\makeatletter
\let\@nil\undefined
\def\compare@PS@operator#1,#2\@nil{%
\def\@tempa{#1}%
\def\@tempb{#2}%
\expandafter\ifx\csname op@token\current@cnt\endcsname\@tempa%
\advance\count1\@ne
\search@primary{\the\count1}{\the\count255}%
\advance\count1\m@ne
\@tokenuse{\the\count1}%
\fi
\ifx\@tempb\empty
\let\next\@gobble
\else
\let\next\compare@PS@operator
\fi
\expandafter\next\@tempb\@nil
}
\makeatother
分析的最后部分:
这就是为什么如果\@nil
有意义的话,babel 就会被绊倒\relax
。
在宏跟踪中可以看到这一点:
\bbl@vforeach #1#2->\def \bbl@forcmd ##1{#2}\bbl@fornext #1,\@nil ,
#1<-LGR,X2,OT2,OT3,OT6,LHE,LWN,LMA,LMC,LMS,LMU,
#2<-\ifin@ \else \lowercase {\bbl@xin@ {,##1enc.def,}{,\@filelist ,}}\fi
\bbl@fornext #1,->\ifx \@nil #1\relax \else \bbl@ifblank {#1}{}{\bbl@trim \bbl@
forcmd {#1}}\expandafter \bbl@fornext \fi
#1<-LGR
这意味着我们将拥有
\bbl@fornext LGR,X2,OT2,OT3,OT6,LHE,LWN,LMA,LMC,LMS,LMU,,\@nil ,
注意两个逗号。当循环到达 LMU 之后的项目时,它是空的,因此\bbl@fornext #1,
获取一个空值#1
并留\@nil ,
在标记流中:
由于#1
为空,测试\ifx \@nil #1\relax
将与进行比较\@nil
,\relax
并且不执行\else
分支。因为与由于中的错误\@nil
具有相同的含义。因此出现了标记流,导致输出中的第一个内容是逗号。\relax
infix-RPN.tex
\@nil ,
答案2
尝试
[...]
\usepackage[turkish,shorthands=off]{babel}
\usepackage{pst-infixplot}
\makeatletter
\let\@nil\@empty
\makeatother
[...]
然而,解决方案algebraic
更简单,当然,向作者提交错误报告。