为什么你的解决方案存在问题

为什么你的解决方案存在问题

根据 David Carlisle 的回答这里,我定义了一个宏来存储当前段落最后一行的长度。但是当将它与 reledmac 和 -par 一起使用时,它会弄乱平行段落的对齐。有人知道为什么吗?

\documentclass{article}
\usepackage{reledmac}
\usepackage{reledpar}
\usepackage{lipsum}

\makeatletter
\def\setindent{%
    {\abovedisplayshortskip\z@\abovedisplayskip\z@
    \belowdisplayshortskip\z@\belowdisplayskip\z@
$$\global\dimen\@ne\predisplaysize
 \xdef\tmp{%
      \predisplaysize\the\predisplaysize
      \prevgraf\the\prevgraf\relax}%
$$\vskip\dimexpr-\parskip-\baselineskip\relax}\tmp
}
\dimen\@ne=\parindent

\begin{document}
\begin{pages}
\begin{Leftside}
\beginnumbering
\pstart
\lipsum*[1]
\pend

\pstart
\lipsum*[2]
\pend

\pstart
\lipsum*[3]
\pend

\pstart
\lipsum*[4]
\pend
\endnumbering
\end{Leftside}

\begin{Rightside}
\beginnumbering
\pstart
\lipsum*[5]\setindent
\pend

\pstart
\lipsum*[6]\setindent 
\pend

\pstart
\makeatletter
\noindent\hskip\dimen\@ne
\lipsum*[7]\setindent  
\pend

\pstart
\makeatletter
\noindent\hskip\dimen\@ne
\lipsum*[8]
\pend
\endnumbering
\end{Rightside}
\end{pages}
\Pages
\end{document}

答案1

为什么你的解决方案存在问题

\pstart…\pend 必须仅包含普通文本。不能包含数学显示,也不能包含 \vskip。任何这样的条目都会扰乱 reledmac/reledpar 的分行方式,从而影响对齐。

我的解决方案的原理

我们将使用 \setindent,但位于 \pstart…\pend 之外。为此,我们利用了这样一个事实:在并行排版中,reledpar 将 \pstart…\pend 内容存储在编号的 vbox 中。因此,我们将复制框的内容,并使用一些 TeX 的框机制技巧,获取 vbox 的最后一行。然后,使用 David Carlisle 提供的新代码,获取最后一行的自然宽度。

其他增强

正如聊天所解释的那样,您不应该\maketaletter在没有相应的情况下使用\makeatother。并且如果您多次使用名称中带有@的命令,则应将其包装在其他命令中。我已经创建了一个\myindent命令。

最终代码如下

\documentclass{article}
\usepackage{reledmac}
\usepackage{reledpar}
\usepackage{lipsum}

\makeatletter
% My new setindent
\def\setindent{%
\ifledRcol
  \setbox0=\expandafter\copy\csname l@dRcolrawbox\the\l@dnumpstartsR\endcsname%On rightside, copy the content of last \pstart…\pend pair
\else
  \setbox0=\expandafter\copy\csname l@dLcolrawbox\the\l@dnumpstartsL\endcsname%On leftside, copy the content of last \pstart…\pend pair
\fi
\expandafter\newdimen\csname l@\the\l@dnumpstartsR\endcsname%
\setbox0=\vbox{%
  \parindent=0pt%
  \setbox1=\vsplit0 to\baselineskip%Get only the last line in vbox0
  \unvbox0%Unvbox it
  \setbox0=\lastbox%Get the last line on the form of hbox
  \setbox0=\hbox{\unhbox0\unpenalty\unskip\unskip}
  \global\dimen\@ne=\wd0%
  }%We do it in a setbox in order to print nothing
}
% Avoid to use command with @ in the main text
\newcommand{\myindent}{\noindent\hskip\dimen\@ne}% I don't understand why we need such correction of 20pt !!! But it is not linked to reledmac,  as a test of your \setindent outside of any reledmac context can prove 
\makeatletter
\begin{document}
\begin{pages}

\begin{Leftside}
\beginnumbering
\pstart
\lipsum*[1]
\pend

\pstart
\lipsum*[2]
\pend

\pstart
\lipsum*[3]
\pend

\pstart
\lipsum*[4]
\pend
\endnumbering
\end{Leftside}

\begin{Rightside}
\beginnumbering
\pstart
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? 
\pend
\setindent
\pstart
\myindent\lipsum*[6]%
\pend
\setindent 
\pstart
\myindent
\lipsum*[7]%
\pend
\setindent  
\pstart
\myindent\lipsum*[8]
\pend
\setindent  
\endnumbering
\end{Rightside}
\end{pages}
\Pages


\end{document}

变体

也许

\newcommand{\myindent}{\noindent\hskip\dimen\@ne}

\newcommand{\myindent}{\noindent\ \hskip\dimen\@ne}

它会在最后一个点后添加一个空格,这是必需的。

相关内容