\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
,如\@minus
for 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}