pst-infixplot 与 babel 在开头放置了意外的逗号符号

pst-infixplot 与 babel 在开头放置了意外的逗号符号

我在文档开头无意中加了一个逗号。如果我注释掉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具有相同的含义。因此出现了标记流,导致输出中的第一个内容是逗号。\relaxinfix-RPN.tex\@nil ,

答案2

尝试

[...]
\usepackage[turkish,shorthands=off]{babel}
\usepackage{pst-infixplot}
\makeatletter
\let\@nil\@empty
\makeatother
[...]

然而,解决方案algebraic更简单,当然,向作者提交错误报告。

相关内容