在源代码中添加额外的行/空格,*不*影响语义

在源代码中添加额外的行/空格,*不*影响语义

我正在编辑一个文件,里面有大量的文本和公式,如下所示

lorem ipsums
\begin{align}
  foo & bar\\
  qux & rofl\\
      & toto
\end{align}
lorem ipsums

当我想让我的编辑器缩进/换行文本时,我遇到一个问题lorem ipsums:它会认为一个段落会一直持续到下一个空白行,这意味着它会将整个内容格式化为如下所示的简介:

lorem ipsums \begin{align} foo & bar\\ qux & rofl\\ & toto \end{align} lorem ipsums …

您可能会同意,阅读和编​​辑它并不是一件愉快的事情。

我想知道是否有办法解决这个问题,以便我可以在公式周围插入行,而不改变语义?

也许类似

lorem ipsums\slurp

\begin{align}
  foo & bar\\
  qux & rofl\\
      & toto
\end{align}
\slurp

lorem ipsums

干杯。

答案1

如果你的编辑器支持注释,那么最简单的方法就是在空白行上放置一个注释字符:

lorem ipsums
%
\begin{align}
  foo & bar\\
  qux & rofl\\
      & toto
\end{align}
%
lorem ipsums

但这只有当您的编辑器知道不要断开注释行时才会起作用。

更新:虽然我认为真正的答案是:使用支持 LaTeX 的格式化程序,但这里有三个针对实际问题的答案。这可能不太优雅,而且可能会破坏其他地方(我没有进行太多测试)。

\documentclass{article}
% \url{http://tex.stackexchange.com/q/24786/86}
\let\savepar=\par
\def\restorepar{\let\par=\savepar}
\def\nopar{\let\par=\restorepar}

\long\def\igpar#1{}

% Equivalent to the above is:
%\makeatletter
%\let\igpar=\@gobble
%\makeatother

\makeatletter
\def\eatpar{\@ifnextchar\par{\@gobble}{}}
\makeatother

\begin{document}

This is a paragraph.

This is the next paragraph.
This should be part of the previous one.

This is a paragraph.

This is the next paragraph.
\nopar

This should be part of the previous one.

This is a paragraph.

This is the next paragraph.
\igpar

This should be part of the previous one.

This is a paragraph.

This is the next paragraph.
\eatpar

This should be part of the previous one.

\end{document}

我建议将它们单独放在一行中。这样不仅可以方便稍后删除它们,还意味着可以保留上一行末尾的间距。

第一个 ( \nopar) 通过重新定义来工作,\par这样下一次出现的\par就会被忽略。因此它只起作用一次,下一次出现的\par也会重置为 ,\par这样下一个one 将像以前一样工作。\nopar实际上,它可以出现在任何地方,而不仅仅是在空白行之前。

第二个 ( \igpar) 只是吞噬了它的下一个参数。由于它是,因此它可以毫无顾忌地\long吞噬 a 。\par

第三个 ( \eatpar) 测试下一个标记是否为 a \par。如果是,则吞掉它。如果不是,则保留它。这可能是最强大的。

它们都能正常工作,因为 TeX 处理空行的方式不同。当输入TeX 处理器看到空白行时,它会将一个\par标记插入到流中。这意味着空白行将被替换为\par 任何宏处理都已完成。因此,在 TeX 内部,我们可以通过测试\pars 来测试空行。否则,我们必须测试换行符,并测试是否连续出现两个换行符。

答案2

考虑\gobblepars

\makeatletter
\newcommand\gobblepars{%
    \@ifnextchar\par%
        {\expandafter\gobblepars\@gobble}%
        {}}
\makeatother

请注意,递归定义允许它吞噬不止一个 par。所以你应该能够摆脱...

One paragraph. \gobblepars




More of that one paragraph.

只需确保在 之前留一个空格\gobblepars即可。或者,您可以修改\gobblepars以在完成后插入一个空格,如下所示:

\makeatletter
\newcommand\gobblepars{%
    \@ifnextchar\par%
        {\expandafter\gobblepars\@gobble}%
        { }}
\makeatother

[背景:我最初发布关于\gobblepars 别处... ]

相关内容