使用 newenvironment/NewEnviron + Command 的不平衡括号

使用 newenvironment/NewEnviron + Command 的不平衡括号

这是我的后续问题使用 newenvironment/NewEnviron 的不平衡支撑帖子。要点是通过使用

\NewEnviron{myEnv}{%
  \expandafter\gdef\expandafter\myCommand\expandafter{\BODY}%
  \aftergroup\bgroup}

我可以扩展

\begin{myEnv}
0.3
\end{myEnv} text2}

\gdef\myCommand
text1
{ text2}

这工作得很好,再次感谢 egreg。请注意,在扩展之前,括号确实不平衡。现在我遇到了类似但略有不同的情况。我想扩展

\begin{myEnv}
0.3
\end{myEnv} text2}

\gdef\myCommand
text1
\eatWhitespace{ text2}

使用 1 参数命令eatWhitespace

我可以用哪个定义来myEnv实现这一点?

背景信息:

为什么有人会这样做?好吧,我正在使用 LyX,但我想使用 caption/subcaption 包而不是 subfig 包(另请参阅subcaption 与 subfig:引用子图的最佳包)。我几乎成功了 - 唯一的问题是图形环境对所有换行符都非常敏感,而 LyX 插入了大量换行符。LyX 的这种行为是硬编码的,我不想从头开始重新编译它。所以我完全没有使用 ERT ... 而是通过使用虚拟命令(这些命令会吃掉空格)来解决这个问题。这是生成的 LyX 输出的示例(是的,它很丑陋):

\newcommand{\dummy}{}
\newcommand{\eatWhitespace}[1]{}
\newcommand{\subfigureWidth}{}
\newcommand{\subfigureImage}{}
\newcommand{\subfigureBlock}[3]{%
    \begin{subfigure}[c]{#1\textwidth}\centering#2\caption{#3}\end{subfigure}}

\begin{figure}
\begin{centering}
\begin{myEnv}
0.3
\end{myEnv}

\dummy}\renewcommand{\subfigureImage}{\mbox{\!\!\!\!{\input{../test/images/im-14.tikz}}


\dummy}}\subfigureBlock{\subfigureWidth}{\subfigureImage}{1st image}\begin{myEnv}
0.3
\end{myEnv}

\dummy}\renewcommand{\subfigureImage}{\mbox{\!\!\!\!{\input{../test/images/im-15.tikz}}


\dummy}}\subfigureBlock{\subfigureWidth}{\subfigureImage}{2nd image}\begin{myEnv}
0.3
\end{myEnv}

\dummy}\renewcommand{\subfigureImage}{\mbox{\!\!\!\!{\input{../test/images/im-16.tikz}}


\dummy}}\subfigureBlock{\subfigureWidth}{\subfigureImage}{3rd image}
\par\end{centering}
\end{figure}

如您所见,当您插入时每次之后 \end{myEnv}这是有意义的(但\eatWhitespace{仍然很丑陋)。其他空格通过使用 来处理mbox,这是可行的。但是,对于子图的长度来说,这是不可能的。因此myEnv使用了这种带有和不平衡括号的疯狂构造。

答案1

[以下代码均未经过测试。但大多数示例都应该可以工作,除非括号不匹配或缺少\makeatletter。]

您努力通过解决 TeX 的(非常合理的)限制(它几乎只操纵平衡的标记列表)来解决 LyX 的(不合理的)限制(添加随机空白行),这无疑是英勇的。但是,有更简单的方法可以忽略空白行。

  1. 使用分隔的参数代替不平衡的括号。

    \long\def\gobbleuntildummy#1\dummy{}
    \newenvironment{myenv}{}{\aftergroup\gobbleuntildummy}
    \begin{myenv}
    \end{myenv}
    
    \dummy
    
  2. 更改类别代码或行尾字符:这在另一个宏的参数中不起作用。

    \newenvironment{ignoreallnewlines}
      {% Uncomment one line.
       % \endlinechar=-1\relax        % or 32 to get spaces
       % \catcode\endlinechar=9\relax % or 10 to get spaces 
      }{}
    \begin{ignoreallnewlines}
      He
      llo, wo
    
      rld!
    
    \end{ignoreallnewlines}
    
  3. 通过递归查找来忽略环境结束后的空格和段落分隔符:

    \newenvironment{ignoreparsafter}{}{\aftergroup\@ignore@pars\par}
    \newcommand{\@ignore@pars}[1]{\@ifnextchar#1{\@ignore@pars}{}}
    \begin{ignoreparsafter}
      Hel%
    \end{ignoreparsafter}
    
    \par
    
    lo!
    
  4. [不要这样做。] 用不平衡的支架固定你的奇特结构可以通过两种方式实现:要么用盒子:

    \newenvironment{ignoreparsafter}{}{\aftergroup\@ignoreuntilbrace}
    \newcommand{\@ignoreuntilbrace}
      {\begingroup\setbox0\hbox\bgroup\aftergroup\endgroup}
    

    或者使用括号技巧(参见括号技巧的问题):

    \newcommand{\@ignoreuntilbrace}
      {\expandafter\@gobble\expandafter{\iffalse}\fi}
    

我忍不住注意到您正在将\centering命令用作环境。使用\begin{center}...\end{center},或者简单地\centering在您希望居中文本的环境范围内使用。

另外...当 LyX 让您失望时,只需使用文本编辑器。

相关内容