当我尝试编译我的 .dtx 时,是什么原因导致(以及如何修复)数组环境中的“放错 \cr”和“放错对齐制表符”错误?

当我尝试编译我的 .dtx 时,是什么原因导致(以及如何修复)数组环境中的“放错 \cr”和“放错对齐制表符”错误?

我创建了一个小包来帮助我排版我有时从事的理论计算机科学特定领域的论文中的各种花絮。到目前为止,它运行良好,但我决定引入自动增长的括号,因为有时我可能会显示一大堆嵌套的括号。为此,我引入了 '完美切割' 包。或者尝试过。

如需完整参考,您可以找到 perfectcut 之前的实现这里以及尝试新的实现这里cpfunc。两者之间唯一的实质性区别是改变了、cpsend和的定义cprecv,并引入新的cpsystems@functorparenscpsystems@msgbraces命令来支持上述新定义。

问题是,仅通过这些更改(据我所知,对的修改cpfunc是唯一真正导致这些问题的修改),现在当我尝试重新编译我的 .dtx 文件(使用命令pdflatex cpsystems.dtx)时,我收到一大堆“放错 \cr”和“放错对齐制表符 &”错误。例如,第一个看起来像:

! Misplaced \cr.
\reserved@c ->\ifnum 0=`{}\fi \cr 
                                  
l.310 ...func{p}{h(R) \cpfunc{p}{h(F)p(P)}}}~c(W)}
                                                  
? 
! Misplaced alignment tab character &.
<recently read> &
                 
l.310 ...func{p}{h(R) \cpfunc{p}{h(F)p(P)}}}~c(W)}

在完整的文件中,这些错误开始于310 行,第 315、370 和 375 行报告了更多错误(尽管出于文档原因,后两行实际上是前两行的重复)。根据对这些错误的讨论,我发现了以下错误:这个 TeXOverflow 问题, 或这个Overleaf 帮助页面,我推测错误可能不是发生在那里,而是发生在上面这一行。但无论如何,我都无法弄清楚问题到底是什么。

有问题的行使用 package 命令,该命令又使用数组环境来呈现某些内容。在上一行,我添加了换行符。我已检查,并且相当确定我已在这些行上指定了正确数量的 & 字符以使所有内容组合在一起,并且我之前没有看到任何错误。

我已尽力创建了一个可重现错误的示例,如下所示,尽管它仍然很长(我不确定在不弄乱某些东西的情况下我还能删除什么):

% \iffalse meta-comment
% !TEX program  = pdfLaTeX
%
% \fi
% \iffalse
%<*readme>
%%cpsystems LaTeX package
%</readme>
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{cpsystems.dtx}
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{cpsystems}
%<*package>
[2020/07/16 v0.14 Package to aid in typesetting cP systems 
    rulesets, following Nicolescu's standard style]
%</package>
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{cpsystems}[2020/07/16 v0.14]
\usepackage{fancyvrb}
\usepackage[hidelinks]{hyperref}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
%\OnlyDescription %Leave this commented out unless you have read the Doc documentation and know what you're doing
\begin{document}
  \DocInput{cpsystems-autogrow-bracks-mwe.dtx}
  \PrintIndex
  \PrintChanges
\end{document}
%</driver>
% \fi
%
%   \begin{cpruleset}
%       \cprule{s_1}{\cpfunc{v}{v(R)Y}}{1}{s_2}{\cpfunc{s}{r(R)~u(Y)~
%       \cpfunc{p}{h(R)p()}}~c(\lambda)}
%       
%       \cprule{s_2}{\cpfunc{s}{r(R)~u() \\ & \cpfunc{p}{h(F)p(P)} \\ & c(C)}}
%       {+}{s_3}{\cpfunc{z}{\cpfunc{p}{h(R) \cpfunc{p}{h(F)p(P)}}}~c(W)}
%       
%       \cprule{s_2}{}{+}{s_2}{\cpfunc{s}{r(R)~u(Z) \\
%       & & & & \cpfunc{p}{h(T) \cpfunc{p}{h(F) p(P)}}
%       \\ & & & & c(CW)}}
%       
%       \cprule{s_2}{s(\_)}{+}{s_2}{}
%       
%       \cprule{s_3}{}{1}{s_4}{p'(P) \quad c'(1D)}
%   \end{cpruleset}
% \StopEventually{\PrintIndex}
% \iffalse
%<*package>
% \fi
%
% \iffalse
%
% \fi
% 
% \subsection{Preamble}
%
%    \begin{macrocode}
%

\RequirePackage{array}
\RequirePackage{framed}
\RequirePackage{changepage}
\RequirePackage{amsmath}
\RequirePackage{trimspaces}
\RequirePackage{newfloat}
\RequirePackage{perfectcut}

\newcounter{cpsystems@RuleNum}
%
%    \begin{macrocode}
\newenvironment{cpruleset}
    {\begin{framed}\begin{adjustwidth}{-1.0em}{-1.0em}
    \renewcommand{\arraystretch}{1.0}\[\begin{array}{lllllr}}
    {\end{array}\]\end{adjustwidth}\end{framed}}
%    \end{macrocode}
%
% % \begin{macro}{\cprule}
%    \begin{macrocode}
\newcommand{\cprule}[5]{
    \refstepcounter{cpsystems@RuleNum}
    \cpsystems@basecprule{#1}{#2}{#3}{#4}{#5}{(\arabic{cpsystems@RuleNum})}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\cpfunc}
% Command for declaring a cP~systems functor.
% The first argument is the symbol for the functor itself, and the second argument is the objects contained inside the functor.
%    \begin{macrocode}
\newcommand{\cpfunc}[2]{
    \trim@spaces@noexp{#1\cpsystems@functorparens{#2}}
}
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{\cpsystems@basecprule}
% For writing out rules inside a |cpruleset| environment.
% Required arguments are, in order, beginning state name; LHS of rule; the label to be applied to the arrow; the ending state name; the RHS of the rule.
%    \begin{macrocode}
\newcommand{\cpsystems@basecprule}[6]{
    \trim@spaces@noexp{#1 & #2 & \rightarrow_{#3} & #4 & #5 & #6\\}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\cpsystems@functorparens}
% To ensure that brackets resize themselves automatically in functors.
%    \begin{macrocode}
\newcommand{\cpsystems@functorparens}[1]{
    \perfectunary{IncreaseHeight}(){#1}
}
%    \end{macrocode}
% \end{macro}
%
% \iffalse
%</package>
% \fi
%
% \Finale
% 

如果版本很重要,我正在使用 MikTex 来运行它,它似乎报告其版本为 20.6.29。AmsMath 是版本 2.17e。“工具”包在 MikTex 控制台中没有列出的版本,但日期为“2020 年 2 月 4 日星期二 10:11:41”。

您能看出问题是什么吗?我想这可能是一些字符放错之类的小问题,但我一直无法弄清楚。(如果有人足够热心,我也愿意接受有关该软件包其他方面的建议:))

编辑:我开始怀疑 perfectcut 包是否真的与这个问题有关,但我不确定它是否真的有关系。为了测试这一点,我删除了该\RequirePackage{perfectcut}行并将 的定义修改cpsystems@cpfunctorparens(#1)。我仍然得到完全相同的错误。保留 perfectcut,但将cpruleset块更改为:

\begin{cpruleset}
    \cpfunc{a}{\cpfunc{b}{\cpfunc{c}{d}}}
\end{cpruleset}

给出了我完全预期的行为。也就是说,我也尝试排除 perfectcut 的 requirepackage 行,但继续使用perfectunarydefine cpfunc,并且似乎没有遇到任何错误,所以我不能 100% 确定我所做的一切都是正确的。有人对我应该做什么来进一步测试以准确确定问题有什么建议吗?

答案1

我今天又回到了这个问题上,似乎发现问题。事实上,问题有两个方面。首先,我没有perfectunary正确使用环境。出于某些愚蠢的原因,我没有使用所有必要的花括号。即定义是

\newcommand{\cpsystems@functorparens}[1]{
    \perfectunary{IncreaseHeight}(){#1}
}

但应该

\newcommand{\cpsystems@functorparens}[1]{
    \perfectunary{IncreaseHeight}{(}{)}{#1}
}

其次,perfectcut 宏(或者至少是 )似乎perfectunary不能很好地处理其内部的换行符。在软件包的 .dtx 文件内的文档中的几个地方,我在cpfunc宏中遇到了换行符。使用perfectunary似乎会破坏这些并导致我看到的错误。我尝试将它们从 更改\\\linebreak根据我读到的内容这里这里,这有所帮助,但并非完全有效。错误不再抱怨放错\crs,而是抱怨放错&s。删除s 可以消除错误,但现在似乎在或宏&中根本没有任何类型的换行。目前,这对我来说比自动增长括号的优先级要低,所以这是我目前做出的权衡。希望我能偶然发现一种方法来恢复它。cpfunccprule

您可以在以下网址找到所有这些结果GitHub 存储库如果您有兴趣的话,请参见版本 v0.15。

相关内容