这是我的后续问题使用 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 的(不合理的)限制(添加随机空白行),这无疑是英勇的。但是,有更简单的方法可以忽略空白行。
使用分隔的参数代替不平衡的括号。
\long\def\gobbleuntildummy#1\dummy{} \newenvironment{myenv}{}{\aftergroup\gobbleuntildummy} \begin{myenv} \end{myenv} \dummy
更改类别代码或行尾字符:这在另一个宏的参数中不起作用。
\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}
通过递归查找来忽略环境结束后的空格和段落分隔符:
\newenvironment{ignoreparsafter}{}{\aftergroup\@ignore@pars\par} \newcommand{\@ignore@pars}[1]{\@ifnextchar#1{\@ignore@pars}{}} \begin{ignoreparsafter} Hel% \end{ignoreparsafter} \par lo!
[不要这样做。] 用不平衡的支架固定你的奇特结构可以通过两种方式实现:要么用盒子:
\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 让您失望时,只需使用文本编辑器。