在双面中scrbook
,我尝试将一系列广泛的图形及其解释分布在两页相对的页面上,如下图所示:
在数字 5 和 6 之间,我强调了一件简单的事情:为了将两页上的项目分开,我目前使用\rule
具有\textwidth
同样宽度的行。但是,左页和右页项目属于一起,因此我希望将规则延伸到内边距(全部延伸到页面边框),以便它们在打印时显示为一行,而不是在同一高度上的两行。
对于偶数页,我只需在规则的宽度上添加一些内容即可\rule{\dimexpr\textwidth+\innermarginwidth}{0.5pt}
实现此目的。但在奇数页上,如何将线延伸到“负”方向?如果添加长度,规则将只进入外边距。此外,这种方法似乎有点老套,我想知道是否有更优雅的解决方案。
考虑这个 MWE,其中\rowrule
是所讨论的命令。奇数/偶数页的大小写切换不是问题,因为我可以使用\Ifthispageodd
。这更像是一个关于如何将规则扩展到内边距的概念问题。
\documentclass[twoside, DIV=11]{scrbook}
\usepackage{dpfloat}
\usepackage{array}
\usepackage{lipsum}
\newcommand{\rowcontent}[1]{%
\begin{tabular}{>{\raggedleft\sffamily\bfseries\arraybackslash}p{10mm}l}
Nr.~#1 & \raisebox{-.4\height}{\rule{.4\textwidth}{25mm}\quad\rule{.4\textwidth}{25mm}}
\end{tabular}}
\newcommand{\rowrule}{\begin{center}\rule{\textwidth}{.5pt}\end{center}}
\newcommand{\explanation}[1]{%
\vphantom{\rowcontent{#1}}%
\begin{minipage}{\textwidth}
Explanatory text for nr.~#1.
\end{minipage}%
}
\begin{document}
\lipsum[1-1]
\begin{leftfullpage}
\noindent%
\rowcontent{1}
\rowrule
\rowcontent{2}
\rowrule
\rowcontent{3}
\end{leftfullpage}
\begin{fullpage}
\noindent%
\explanation{1}
\rowrule
\explanation{2}
\rowrule
\explanation{3}
\end{fullpage}
\end{document}
更新 2023-01-23:Werner 的出色方法导致相应高度不匹配:在右侧,每个项目获得的空间都比左侧多。我将问题缩小到\hspace*{\linewidth}
中的使用\resetleftrightblocksep
。为了解决这个问题,我结合了两个答案,现在分别使用以下内容:
\resetleftrightblocksep{\unskip\begin{flushright}\rule{0pt}{0pt}\llap{\rule{\paperwidth}{.5pt}}\end{flushright}}
\resetleftrightblocksep{\unskip\begin{flushleft}\rule{0pt}{0pt}\rlap{\rule{\paperwidth}{.5pt}}\end{flushleft}}
答案1
无需精确。您可以绘制一条长度2\textwidth
或更长的线。将规则分别括在\rlap
或\llap
和 中flushleft
,然后分别括flushright
在 和 中,以避免垂直间距问题。此外,以 开头\rule{0pt}{0pt}
。
以下是宏:
\newcommand{\leftrowrule}{\begin{flushleft}\rule{0pt}{0pt}\rlap{\rule{2\textwidth}{.5pt}}\end{flushleft}}
\newcommand{\rightrowrule}{\begin{flushright}\rule{0pt}{0pt}\llap{\rule{2\textwidth}{.5pt}}\end{flushright}}
代码如下:
\begin{leftfullpage}
\noindent%
\rowcontent{1}
\leftrowrule
\rowcontent{2}
\leftrowrule
\rowcontent{3}
\end{leftfullpage}
\begin{fullpage}
\noindent%
\explanation{1}
\rightrowrule
\explanation{2}
\rightrowrule
\explanation{3}
\end{fullpage}
\end{document}
答案2
以下旨在将过程合并到单一环境中 -fullleftrightpage
并使用\splitcontent{<left>}{<right>}
宏分别捕获<left>
/<right>
页面上发生的内容。
\documentclass[twoside, DIV=11]{scrbook}
\usepackage{lipsum}
\usepackage{etoolbox}
\usepackage[export]{adjustbox}
% For measuring content on left/right pages
\newsavebox{\leftblock}
\newsavebox{\rightblock}
\newcommand{\leftrightblocksep}{}
\NewDocumentCommand{\splitcontent}{ m m }{%
% \splitcontent{<left>}{<right>}
\begin{lrbox}{\leftblock}#1\end{lrbox}% Store #1
\begin{lrbox}{\rightblock}\begin{minipage}{\linewidth}#2\end{minipage}\end{lrbox}% Store #2
\edef\x{\noexpand\def\noexpand\x{% Define proper strut based on max total height
\noexpand\rule[-\fpeval{max(\dp\leftblock,\dp\rightblock)}pt]{0pt}{\fpeval{max(\dp\leftblock+\ht\leftblock,\dp\rightblock+\ht\rightblock)}pt}}}\x%
% Add content for left page
\expandafter\listadd\expandafter{\expandafter\leftpagelist\expandafter}\expandafter{\x%
\begingroup#1\endgroup%
}%
% Add content for right page
\expandafter\listadd\expandafter{\expandafter\rightpagelist\expandafter}\expandafter{\x%
\begin{minipage}{\linewidth}#2\end{minipage}%
}%
}
\newcommand{\resetleftrightblocksep}[1]{%
% Delayed update (https://tex.stackexchange.com/a/89187/5764)
\renewcommand{\leftrightblocksep}{\renewcommand{\leftrightblocksep}{%
\par\addvspace{.5\baselineskip}%
#1%
\par\addvspace{.5\baselineskip}}}%
}
\NewDocumentEnvironment{fullleftrightpage}{}{%
\clearpage
\Ifthispageodd{\mbox{}\clearpage}{}%
\global\let\leftpagelist\relax% Clear list with left page content
\global\let\rightpagelist\relax% Clear list with right page content
\setlength{\parindent}{0pt}% Remove paragraph indent
}{%
% Process left page
\resetleftrightblocksep{\rlap{\rule{\paperwidth}{.5pt}}}%
\renewcommand{\do}[1]{\leftrightblocksep##1}%
\dolistloop{\leftpagelist}% Process left page list
\clearpage
% Process right page
\resetleftrightblocksep{\hspace*{\linewidth}\llap{\rule{\paperwidth}{.5pt}}}%
\dolistloop{\rightpagelist}% Process right page list
\clearpage
}
\begin{document}
\lipsum[1-1]
\begin{fullleftrightpage}
\splitcontent{left}{right}%
\splitcontent{\bfseries Nr~1 \quad \includegraphics[valign=m,height=3\baselineskip]{example-image}}{\lipsum[1]}%
\splitcontent{left}{right}%
\splitcontent
{\makebox[\linewidth]{\bfseries Nr~2 \hfill \includegraphics[valign=m,height=3.14\baselineskip]{example-image-a}\quad\includegraphics[valign=m,height=3.14\baselineskip]{example-image-b}}}
{right}
\splitcontent{left}{right}%
\end{fullleftrightpage}
\end{document}
该过程将左/右组件存储在列表中,并使用以下方法对每个页面进行处理etoolbox
的列表管理/处理功能。对于每个元素对,内容都存储在一个框中,以测量最大总高度(深度 + 高度),并以此作为支柱,以获得跨页面的相等高度。