从文本区域的外边框到页面内边框画一条线

从文本区域的外边框到页面内边框画一条线

在双面中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的列表管理/处理功能。对于每个元素对,内容都存储在一个框中,以测量最大总高度(深度 + 高度),并以此作为支柱,以获得跨页面的相等高度。

相关内容