\raggedyleft在回忆录中?

\raggedyleft在回忆录中?

\raggedright在 memoir 中,你可以使用而不是\raggedyright[<space>],在窄列中,这要美观得多。但是我还需要的是\raggedyleft不存在,我不知道为什么。这是\raggedyright中的实现memoir

\newdimen\ragrparindent
  \setlength{\ragrparindent}{\parindent}
\newcommand{\raggedyright}[1][2em]{%
  \let\\\@centercr\@rightskip \z@ \@plus #1\relax
%%%  \rightskip\@rightskip
  \memRTLrightskip\@rightskip
%%%  \leftskip\z@skip
  \memRTLleftskip\z@skip
  \parindent\ragrparindent}

作为一个不太了解TeX宏的人,我无法弄清楚它到底是如何工作的。如果有人能给我解释一下这段代码并告诉我该怎么做,我将不胜感激\raggedyleft

答案1

lockstep 给出了定义;我们来看看原始代码是什么意思。

\newdimen\ragrparindent

这将设置一个新参数。

  \setlength{\ragrparindent}{\parindent}

这设置了值;我更喜欢

\AtBeginDocument{
  \setlength{\ragrparindent}{\parindent}
}

但开发人员的memoir选择不同。

\newcommand{\raggedyright}[1][2em]{%

\raggedyright这开始了具有可选参数的定义,其默认值为 2em

  \let\\\@centercr

这说明\\必须是\@centercr,,,中使用的 LaTeX 内核的包装器命令\raggedright\centering以及\raggedleft,用于正确结束行。

  \@rightskip \z@ \@plus #1\relax
%%%  \rightskip\@rightskip
  \memRTLrightskip\@rightskip

内部参数\@rightskip设置为具有自然宽度 0pt 和可拉伸性的柔性胶合,其值等于作为可选参数给出的值。注释行将设置\rightskip为相等\@rightskip\rightskip是 TeX 始终添加到行右侧的胶合量(通常为零)。为了与软件包兼容,将设置bidi该参数\memRTLrightskip(因此它将\rightskip以 LTR 书写,\leftskip以 RTL 书写)。

%%%  \leftskip\z@skip
  \memRTLleftskip\z@skip

leftskip 设置为零。

  \parindent\ragrparindent}

通过设置,这将结束定义\parindent(我们可能处于父项已被更改或清除的情况)。

因此,改变所需的内容,的定义\raggedyleft将是

\newcommand{\raggedyleft}[1][2em]{%
  \let\\\@centercr
  \leftskip \z@ \@plus #1\relax
  \memRTLleftskip\leftskip
  \memRTLrightskip\z@skip
  \parindent=\z@
  \parfillskip=\z@skip}

虽然在不规则的右侧设置中,非零 parindent 可能是可取的(事实上,它),在左边不规则的设置中,这绝对是不必要的。还有另一个调整要做:最后一条线也应该与右边齐平,因此也\parfillskip必须设置为零。

左右之间存在不对称性,因为\rightskip也在环境中使用trivlist,因此内核需要一个“重复寄存器”来维持稳定的值。 情况并非如此\leftskip,因此有 \@leftskip


\z@关于、\z@skip和 的说明\@plus。第一个是维度寄存器,永久设置为 0pt,根据 TeX 规则,可以在 TeX 需要维度或整数(分别表示 0pt 或 0)的所有情况下使用。接下来\z@skip是跳过寄存器,永久设置为0pt plus 0pt minus 0pt,可用于将任何跳过参数设置为零(橡胶长度在 LaTeXspeak 中)。

\@plus代表关键字plus,如\@minusfor minus、 so

\z@skip\z@ \@plus \z@ \@minus \z@

相当于说

\z@skip=0pt plus 0pt minus 0pt

但在定义中前者使用 6 个标记,而后者使用 24 个。在编写 LaTeX 内核时,标记内存考虑非常重要,因此仍然习惯使用“缩写形式”,但它还有另一个优点:它们在考虑应该存在但最终被忽略的空间时减轻了一些负担。

答案2

基本上,需要查找\raggedright(LaTeX2e core) 和\raggedyright( memoir) 之间的差异,然后修改 {LaTeX2e core) 的定义\raggedleft以创建\raggedyleft。请注意,我没有实现\raglparindent长度。

\documentclass[11pt]{memoir}

\makeatletter
\newcommand{\raggedyleft}[1][2em]{%
  \let\\\@centercr
  \memRTLleftskip\z@ \@plus #1\relax
  \memRTLrightskip\z@skip
  \parindent\z@
  \parfillskip\z@skip
}
\makeatother

\usepackage{lipsum}

\begin{document}

\raggedleft

\lipsum[1]

\bigskip

\raggedyleft

\lipsum[1]

\bigskip

\raggedyleft[1fil]% same effect as \raggedleft

\lipsum[1]

\end{document}

在此处输入图片描述

相关内容