该parallel
包能够设置平行列并将它们在\ParallelPar
标记处对齐:
\documentclass{article}
\usepackage{parallel}
\usepackage{mwe}
\begin{document}
\begin{Parallel}[c]{.45\textwidth}{.45\textwidth}
\ParallelLText{\lipsum[1]}
\ParallelRText{\lipsum[3]}
\ParallelPar
\ParallelLText{\lipsum[2]}
\ParallelRText{\lipsum[4]}
\ParallelPar
\ParallelLText{\lipsum[5]}
\ParallelRText{\lipsum[7]}
\end{Parallel}
\end{document}
但是,当您将c
(列) 选项更改为p
(页) 时,对齐会丢失。我该如何获得所需的行为?
我没有被任何特定的输入格式所束缚,尽管我正在阅读这种格式。
解决方案构想
\tikzmark
我想到了,但我从未使用过它,我不确定它是否适用。这里的核心问题是,首先开始在每个段落的开头,我们需要记录我们在页面上的垂直位置,并将其保存在某个队列中。假设我们正在排版原始文本(外文)背面(跨页左页)和右页。每个要在背面和正面设置的段落都应保存在一个框中。(我假设我们不会拥有超过n段落:)
。 n很小。;我知道盒子寄存器的数量是有限的。)每个盒子的深度应设置为原文和译文的最大值。然后将此深度排入队列。继续以这种方式在背面设置盒子,直到我们无法将段落放在页面上。此时,根据深度队列放置要放在正面的盒子。(如果我们手动设置盒子的深度,也许这个队列不是必需的,但我不确定这是否会扭曲文本graphicx
。)
潜在算法
如果该软件包不支持此功能parallel
,我已经想出了一个应该可行的算法 - 我只是不太愿意实现它;我以前从未跨页面工作过。
- 阅读要对齐到框中的文本块:
\l_original_box
和\l_translation_box
。 - 将每个箱子的深度设置为它们之间的最大值。
\l_original_box
适合此页面吗 ?- 是的
- 排版
\l_original_box
。 - 放入
\l_translation_box
队列(aseq
)。
- 排版
- 不
- 开始新的一页。
- 将(翻译的)清空队列放到页面上。(假设页面尺寸相同,这应该适合页面,因为深度与原始内容相同。)
- 是的
- 循环直到
EOF
。(见链接。
编辑:当我尝试使用上述算法来解决这个问题时(工作正在进行中),我注意到必须小心处理长行。在verse
环境中,长行会缩进。(有没有类似parbox
for 的东西expl3
?)
答案1
正如我在评论中所建议的那样,我修改了答案如何创建按段落对齐的 6 个平行文本,每页 3 个文本?。在这里,我将其设为两列而不是六列,并删除了外语支持。我在表格中保留了行,因为我认为更容易看到在哪里删除它们,而不是在哪里添加它们。列宽由长度定义\colwidth
,当前设置为0.9\textwidth
。
我还只是按照您的 MWE 在框中放置了简单的 lipsum,尽管该方法支持列\centering
和quote
环境。列条目不会在中间断开,但将完全包含在单个页面上。每个条目底部的空白行是 的产物\lipsum
,默认情况下,末尾包含一个新段落。
\documentclass[]{article}
\usepackage{ifthen}
\usepackage{calc}
\usepackage{lipsum}
\makeatletter
\newcounter{tabindex}
\newtoks\@tabtoks
\newcommand\addtabtoks[1]{%
\@tabtoks\expandafter{\the\@tabtoks\stepcounter{tabindex}#1}}
\newcommand*\resettabtoks{\@tabtoks{}}
\newcommand*\synctabindex[1]{\setcounter{tabindex}{\value{#1}}}
\newcommand*\printtabtoks{\the\@tabtoks}
\makeatother
\def\colwidth{.9\textwidth}
\newcounter{sptstartrow}
\newcounter{sptendrow}
\newcounter{entries}
\newcounter{pagerows}
\newlength\CurrentTableHeight
\newlength\CurrentRowHeight
\newsavebox\pagerow
\newcommand\newspecialtable{%
\setcounter{sptendrow}{0}%
\setcounter{entries}{0}%
\setcounter{pagerows}{0}%
\setlength\CurrentTableHeight{0pt}%
}
\makeatletter
\newcommand\twoby[2]{%
\stepcounter{entries}%
\expandafter\def\csname entryX\roman{entries}Xa\endcsname{#1}%
\expandafter\def\csname entryX\roman{entries}Xf\endcsname{#2}%
\synctabindex{entries}%
\sbox{\pagerow}{\formatcol{a}\formatcol{f}}%
\setlength\CurrentRowHeight{\ht\pagerow+\dp\pagerow}%
\addtolength\CurrentTableHeight{\CurrentRowHeight}%
\ifdim\CurrentTableHeight>\textheight %
\makespecialtable[\thepagerows]%
\setcounter{pagerows}{0}%
\setlength\CurrentTableHeight{\CurrentRowHeight}%
\else\fi%
\stepcounter{pagerows}%
}
\makeatother
\newcounter{index}
\newcommand\makespecialtable[1][\theentries]{%
\setcounter{sptstartrow}{\thesptendrow}%
\addtocounter{sptendrow}{#1}%
\ifthenelse{\thesptendrow > \theentries}{\setcounter{sptendrow}{\theentries}}{}%
\clearpage
\setcounter{index}{\thesptstartrow}%
\synctabindex{index}
\resettabtoks%
\whiledo{\theindex < \thesptendrow}{%
\stepcounter{index}%
\addtabtoks{%
\csname entryX\roman{tabindex}Xa\endcsname &
\vphantom{\formatcol{f}}
\\%
\hline%
}%
}%
\begin{tabular}{|p{\colwidth}|@{\extracolsep{-\tabcolsep}}l}%
\hline%
\printtabtoks%
\end{tabular}%
\clearpage
\setcounter{index}{\thesptstartrow}%
\synctabindex{index}
\resettabtoks%
\whiledo{\theindex < \thesptendrow}{%
\stepcounter{index}%
\addtabtoks{%
\csname entryX\roman{tabindex}Xf\endcsname &
\vphantom{\formatcol{a}}
\\%
\hline%
}%
}%
\begin{tabular}{|p{\colwidth}|@{\extracolsep{-\tabcolsep}}l}%
\hline%
\printtabtoks%
\end{tabular}%
}
\newcommand\formatcol[1]{%
\parbox[t]{\colwidth}{\csname entryX\roman{tabindex}X#1\endcsname\strut}%
}
\newcommand\finishspecialtable{\makespecialtable}
\begin{document}
\centering
\newspecialtable
\twoby
{\lipsum[1]}%
{\lipsum[3]}%
\twoby
{\lipsum[2]}%
{\lipsum[4]}
\twoby
{\lipsum[5]}%
{\lipsum[7]}
\twoby
{\lipsum[1-2]}%
{\lipsum[3]}%
\twoby
{\lipsum[2]}%
{\lipsum[5]}
\finishspecialtable
\end{document}