LaTeX 中的对齐和分组:如何解释这种行为?

LaTeX 中的对齐和分组:如何解释这种行为?

我目前正在写LaTeX.js在浏览器中将 LaTeX 翻译成 HTML。所以我希望它尽可能准确。然而,TeX 的对齐实现和 LaTeX 的对齐实现\\让这变得很困难。

简单开始:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Ut enim ad minim veniam, quis nostrud\\               % centered!
exercitation ullamco laboris\\                        % centered!
nisi ut aliquip ex ea commodo consequat.\raggedleft

您可能会认为整个第二段现在将与右对齐,因为这\leftskip会影响整个当前段落(以及所有后续段落)。但事实并非如此;相反,倒数第二行和倒数第三行现在居中了!为什么会这样?是因为\\插入了一些填充胶水吗?我没有找到或理解 LaTeX 真正如何实现\\

假设胶水是原因,那么为什么不选择无限大的胶水来\leftskip防止定心呢?

然后我发现,如果将其移动\raggedleft到段落的开头,它会按预期工作:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

\raggedleft
Ut enim ad minim veniam, quis nostrud\\               % fine
exercitation ullamco laboris\\                        % fine
nisi ut aliquip ex ea commodo consequat.

您如何解释这一点?这是错误还是故意的?我不可能让 LaTeX.js 表现得那样 :(

但事情还没结束。我们把它归为一组:

{
  Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
  sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

  Ut enim ad minim veniam, quis nostrud\\ 
  exercitation ullamco laboris\\
  nisi ut aliquip ex ea commodo consequat.\raggedleft
}

Already\raggedleft不再执行任何操作。似乎是因为没有结束的段落。并且当段落在组后结束时,它具有\leftskip和的值\rightskip已经重置。对吗?

如果是这样,那可以理解。组中的最后一段总是会重置对齐。但同样,如果您添加以下内容,就会感到惊讶\\

{
  Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
  sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

  Ut enim ad minim veniam, quis nostrud\\ 
  exercitation ullamco laboris\\
  nisi ut aliquip ex ea commodo consequat.\raggedleft

  Lorem ipsum dolor sit amet,\\       % ?! raggedleft
  consectetur adipiscing elit,\\      % ?! raggedleft
  sed do eiusmod tempor incididunt.   % justified
}

在这里,我本来希望整个最后一段都是两端对齐的,但它似乎\\表现得好像要开始一个新段落?!但事实并非如此,因为\parindent没有应用。

这里发生了什么?

编辑:正如 David 所要求的,实际上没有其他内容。以下是完整文档:

\documentclass{article}

\begin{document}

{
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
    sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

    Ut enim ad minim veniam, quis nostrud\\             % centered
    exercitation ullamco laboris\\                      % centered
    nisi ut aliquip ex ea commodo consequat.\raggedleft

    Lorem ipsum dolor sit amet,\\       % ?! raggedleft
    consectetur adipiscing elit,\\      % ?! raggedleft
    sed do eiusmod tempor incididunt.   % justified
}

\end{document}

在此处输入图片描述

答案1

初始标记不正确(但未被 Latex 标记为错误)

\raggedright并且\raggedleft应该在段落之前使用,它会设置不规则\rightskip(即使声明在段落中间使用也会生效)但它也会设置\parindent为零并定义\\为提供不规则兼容的换行符。

如果像这里一样您使用\raggedleftlate,那么您将获得 的设置\rightskip\leftskip并且\parfillskip在段落末尾生效,但是您会从段落之前生效的任何内容中获得段落缩进,并且同样\\会扩展为“正常”定义。

\\因此,在您的示例中,第一段的定义与之后第二段的定义完全不同\raggedright

您会得到一条中心线,因为“​​正常”\\本质上会\hfil\linebreak 形成一条短线,但如果您在 raggedleft 的范围内使用该定义,那么您还可以\hfil在左侧给出 raggedmargin,所以您最终会得到一条中心线。

因此,如果将示例\\展开(并稍微简化)的话,可能会更容易理解

\documentclass{article}

\begin{document}

{
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
    sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

    Ut enim ad minim veniam, quis nostrud\unskip\nobreak\hfil\break            % centered
    exercitation ullamco laboris\unskip\nobreak\hfil\break                      % centered
    nisi ut aliquip ex ea commodo consequat.\raggedleft

    Lorem ipsum dolor sit amet,\par\noindent       % ?! raggedleft
    consectetur adipiscing elit,\par\noindent      % ?! raggedleft
    sed do eiusmod tempor incididunt.   % justified
}

\end{document}

答案2

在正常情况下,\\表示“在这里断行”,发出\hfil\break(当*添加或可选参数时它会做其他的事情,但这些与解释无关)。

但是,\raggedright\raggedleft其定义更改为\@centercr,在您的情况下\unskip\par, 。因此,让我们翻译您的代码:

{
  Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
  sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

  Ut enim ad minim veniam, quis nostrud\hfil\break 
  exercitation ullamco laboris\hfil\break
  nisi ut aliquip ex ea commodo consequat.\raggedleft

  Lorem ipsum dolor sit amet,\unskip\par
  consectetur adipiscing elit,\unskip\par
  sed do eiusmod tempor incididunt.
}

第一段排版正常,没有问题。

第二段在\raggedleft执行完毕后结束。此命令除了其他功能外,还将 设置\leftskip\hfil\rightskip设置为零以及\parfillskip

此时我们应该注意TeX使用的值 \leftskip\rightskip \parfillskip 段落结束时的当前状态。

因此,第二段中的每一行(最后一行除外)实际上都\hfil在两侧有粘连,最终居中。最后一行仅\hfil在其左侧有粘连,因此最终与右侧齐平。

第一行也有缩进框,因此居中在视觉上并不完美,但就行内的框而言是可以的。

接下来的三行是三个独立的段落;前两行正如预期的那样,右对齐,因为\raggedleft仍然有效。

最后一行有\par 下列的结束括号,因此 的效果\raggedleft被取消,段落排版对齐。缩进框在哪里?无处可去,因为前一个\raggedleft已设置\parindent为零,并且缩进框在段落开始时插入(在本例中,当 TeX 扫描到字母 时s)。

相关内容