我怎样才能反转两个(宽度不等)列的位置,以便较宽的列始终靠在内边距上?

我怎样才能反转两个(宽度不等)列的位置,以便较宽的列始终靠在内边距上?

我是 LaTeX 的新手,我正尝试用它为我的 MFA 项目申请写一份排版整齐的小说草稿(从粗略的打字草稿开始),并最终发送给出版商。我意识到,对于后者,许多人更喜欢 MS Word,但 Word 只是不能做我需要做的事。

那么。这是我目前的问题(以及有关相关问题的其他几个问题)。提前为这篇长文道歉——请耐心等待!

我的一半章节(奇数章节)使用的布局是,任何给定页面都有两列不同长度的列,以及外边距注释。我需要两列中较宽的一列始终与内边距齐平,这样,对于任何跨页,较宽的列将在相对的页面上彼此相邻,较窄的列位于中间一对较宽列的相对两侧。基本上,较宽列的文本是独立的内容,而较窄列的文本是注释。(这当然意味着它们需要彼此保持分离,同时让各自的文本连续地跨分页符流动——这不会有问题,因为它们是列而不是框,对吧?)。

\柱状图就宽度不同问题而言,包似乎是一个不错的选择,但我似乎找不到有关如何使用它来形成我需要的布局的任何信息。(换句话说,从我所能找到的信息来看,\柱状图总是在同一侧)。是否可以将一些条件直接写入 parcolumns 本身的代码中,以便包可以自动执行此操作?或者是否可以将所有这些都放在文档的序言中?

(在进行大量研究的同时不是写这篇文章时,我注意到第 16 页文章/指南\多列环境,他们将其编码\moveright\multicol@leftmargin为一系列操作中的第一步,用于切换 R->L 语言的列顺序。这可能起到一定作用吗?)

[因不相关而被删除;请参阅更新]

最后:我应该在这里提到的一个重要警告是,我需要能够在两列中较窄的一列内放置一些较小的文本框,例如,0.6\linewidth较窄的列与列的内边距齐平,然后让列的正文环绕它们。此外,因为我已经开发了自己的基本散文写作替代格式,该格式使用不同宽度的非缩进文本块来区分叙述文本(全行宽度)和对话文本(由于改进而删除;请参阅更新),我需要能够在此处讨论的宽列中使用这些命令……正如我从大量阅读中了解到的那样,使用长表是行不通的。因此,这些章节绝对必须使用实际的柱子进行组装。

更新:

进一步阅读(本网站上的两篇文章,以及仔细检查实施部分)用户指南\柱状图,我发现\ifoddpage包。因此,为了在这里添加更多具体性,是否可以对以下代码进行修改:parcolumns.sty

a) 添加\RequirePackage{ifoddpage}到序言中。

b) 在第 95 行和第 96 行之间,设置(第 96-173 行,第 96、111、125、144 和 164 行中的\checkoddpage \@ifoddpage{“<”更改为“=”) (原始第 96-173 行),或某些等效条件。\loop\ifnum\count@<\pc@columncount%}{}

我确信一定有一些更复杂、更少代码笨重的方法来做到这一点,但我不确定如何做……此外,是否应该在条件下设置代码的其他部分?是\ifoddpage甚至能够处理这种大小的条件语句?我是否遗漏了有关命令的重要信息\checkoddpage,例如我必须为包编写一些额外的代码才能检测页码?

我已经或多或少地弄清楚了其他所有事情,从我第一栏中的 minipage/wrapfigure 框到边注,再到一组更好的命令,这些命令将允许文本在我的替代散文格式中更普遍地在页面上连续流动(使用调整宽度环境来自\更改页面,而不是使用\parbox...我快到了。我只需要翻转这些列。任何非\柱状图有什么建议吗?

更新 #2

根据 Stephan Lehmke 的要求/建议,这里是生成的 PDF 的代码和图像。

\documentclass[11pt,letterpage,twosides]{bookest}
%
\geometry{textheight=9in,vmarginratio=1:1,outermargin=1.5in,innermargin=.5in,%
marginparwidth=1.25in,marginparsep=.2in}
\usepackage{parcolumns}
\usepackage{marginnote}
\usepackage{wrapfig}
\usepackage{lipsum}
% 
% % % % % [Many lines of new commands have been omitted, as they are not relevant here.]
%
%%%%% For use in \parcolumns environment
\newcommand{\warfo}{\begin{wrapfigure}{o}[.15in]{1.5in} \begin{minipage}[t]{1.4in} %
\noindent \Large}
\newcommand{\warfi}{\begin{wrapfigure}{i}[.15in]{1.5in} \begin{minipage}[t]{1.4in} %
\noindent \Large}
\newcommand{\wraf}{\end{minipage} \vspace{-.265in} \end{wrapfigure}}
\newcommand{\stm}{\marginnote}
%
\begin{document}
%
\chapter{Sample Experimental Chapter Layout}
%
\begin{parcolumns}[sloppy=true,sloppyspaces=true,nofirstindent=true,colwidths={1=2.8in, %
2=3.5in}]{2}
%
\colchunk[1]{\small \indent \lipsum[14] \warfi{Sample  wrapped text box, using a minipage %
inside a wrapfig environment.} \wraf \lipsum[15] \warfo{Another sample wrapped text box, % 
placed along the inner side of the \\ column.} \wraf \lipsum[16]  \lipsum[17]}
%
\colchunk[2]{\Large \indent \stm{\normalsize \textbf{Sample margin note, always to be on % 
the outer margin. \\ ---------- \\ Aside from the placement of the margin note, the layout %
 of this odd page is incorrect. The order of the two columns should be switched, so that % 
 the larger/wider column is placed along the inner margin, and the smaller/thinner column % 
 is placed along the outer margin.}} \lipsum[10] \lipsum[11] \lipsum[12] \lipsum[13] %
 \stm{\textbf{\normalsize The layout of this even page is correct, with the larger column % 
 on the inner margin and the smaller column on the outer one, with the wrapped text box on %
 the inner edge of the smaller column. \\ ---------- \\ However, can I suppress this extra%
 line between paragraphs in the inner column?}} \lipsum[14]}
%
\end{parcolumns}
%
\end{document}

以下是制作的页面。所有内容均在边注中进行了解释。 在此处输入图片描述 在此处输入图片描述

请注意第 2 页较大内部段落之间的空白行——输入时如何消除该断行\marginnote

答案1

编辑(2012 年 7 月 25 日)

以下版本中有一个与分隔空间的列有关的小错误。我修复了这个问题,并将整个parcolumns补丁打包在一个名为的小包中parcolsx,以便您可以执行以下操作:

\documentclass{book}
\usepackage{geometry}
\usepackage{parcolumns}
\usepackage{parcolsx}
\usepackage{lipsum}
\begin{document}
\chapter{Chapter heading}
\begin{parcolumns}[%
  sloppy        = true,
  sloppyspaces  = true,
  nofirstindent = true,
  colwidths     = {1=0.43\textwidth, 2=0.53\textwidth}
]{2}
\colchunk[1]{\small\indent%
  \lipsum[14] 
  \lipsum[15]
  \lipsum[16]
  \lipsum[17]
}
\colchunk[2]{\Large\indent%
  \lipsum[10]
  \lipsum[11]
  \lipsum[12]
  \lipsum[13]
}
\end{parcolumns}
\end{document}

alternate = true注意环境参数中的附加键/值对parcolumns。这样可以随意激活交替列。

要保存的包parcolsx位于名为的文件中parcolsx.sty

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{parcolsx}

\RequirePackage{changepage}
\strictpagecheck

% add the additional boolean key `alternate' 
% to the `parcolumns' environment
\newif\ifpc@alternate
\define@key{parcolumns}{alternate}[true]{%
\pc@boolkey{pc@alternate}{#1}%
}

% slightly modify the `\pc@placeboxes' macro to distinguish between odd
% and even pages, if the option `alternate=true' was passed to the
% `parcolumns' environment
\def\pc@placeboxes{%
  \global\let\@tempa\relax%
  \hb@xt@\linewidth{%
    \vfuzz30ex %
    \vbadness\@M%
    \splittopskip\z@skip%
    % odd is the default
    \ifpc@alternate \checkoddpage \else \oddpagetrue \fi%
    \ifoddpage
      % count up from 1 to N_col
      \count@\z@%
      \loop\ifnum\count@<\pc@columncount%
        \advance\count@\@ne%
        \pcx@placeboxes@body%
        \ifnum\count@<\pc@columncount%
          \strut\hfill\ifpc@rulebetween\vrule\hfill\fi%
        \fi%
      \repeat%
    \else
      % count down from N_col to 1
      \count@\pc@columncount%
      \loop\ifnum\count@>\z@%
        \pcx@placeboxes@body%
        \advance\count@\m@ne%
        \ifnum\count@>\z@%
          \strut\hfill\ifpc@rulebetween\vrule\hfill\fi%
        \fi%
      \repeat%
    \fi
  }%
  \@tempa%
}

% the fraction of `\pc@placeboxes' that does not depend on the page
% parity
\def\pcx@placeboxes@body{%
  \expandafter\ifvoid\csname pc@column@\number\count@\endcsname%
    \hskip\csname pc@column@width@\number\count@\endcsname%
  \else%
    \expandafter\setbox\expandafter\@tempboxa%
      \expandafter\vsplit\csname pc@column@\number\count@\endcsname%
        to \dp\strutbox%
    \expandafter\@tempdimb\csname pc@column@width@\number\count@\endcsname%
    \hbox to \@tempdimb {\vbox{\unvbox\@tempboxa}\hfill}%
  \fi%
  \expandafter\ifvoid\csname pc@column@\number\count@\endcsname%
  \else%
    \global\let\@tempa\pc@placeboxes%
  \fi%
}

附注:该补丁还修复了parcolumnswrapfigure软件包的不兼容性。我将在另一个帖子中对此进行评论:Wrapfigure-Minipage 困境


原始答案(包括列分隔符错误)

您要求很多不同的东西,您的示例文档包含很多可能在这里没有帮助的内容。但是,我可能已经找到了解决您的列切换问题的方法。

请看这个更简约的例子:

\documentclass{book}
\usepackage{geometry}
\usepackage{parcolumns}

\usepackage{changepage}
\strictpagecheck

\usepackage{lipsum}

\makeatletter

\def\pc@placeboxes{%
  \global\let\@tempa\relax%
  \hb@xt@\linewidth{%
    \vfuzz30ex %
    \vbadness\@M%
    \splittopskip\z@skip%
    \checkoddpage\ifoddpage
      \count@\z@%
      \loop\ifnum\count@<\pc@columncount%
        \advance\count@\@ne%
        \my@placeboxes@body%
      \repeat%
    \else
      \count@\pc@columncount%
      \loop\ifnum\count@>\z@%
        \my@placeboxes@body%
        \advance\count@\m@ne%
      \repeat%
    \fi
  }%
  \@tempa%
}

\def\my@placeboxes@body{%
  \expandafter\ifvoid\csname pc@column@\number\count@\endcsname%
    \hskip\csname pc@column@width@\number\count@\endcsname%
  \else%
    \expandafter\setbox\expandafter\@tempboxa%
      \expandafter\vsplit\csname pc@column@\number\count@\endcsname%
        to \dp\strutbox%
    \vbox{\unvbox\@tempboxa}%
  \fi%
  \expandafter\ifvoid\csname pc@column@\number\count@\endcsname%
  \else%
    \global\let\@tempa\pc@placeboxes%
  \fi%
  \ifnum\count@>\z@%
    \strut%
    \hfill%
    \ifpc@rulebetween%
      \vrule%
      \hfill%
    \fi%
  \fi%
}

\makeatother

\begin{document}

\chapter{Chapter heading}

\begin{parcolumns}[%
  sloppy        = true,
  sloppyspaces  = true,
  nofirstindent = true,
  colwidths     = {1=0.43\textwidth, 2=0.53\textwidth}
]{2}

\colchunk[1]{\small\indent%
  \lipsum[14] 
  \lipsum[15]
  \lipsum[16]
  \lipsum[17]
}

\colchunk[2]{\Large\indent%
  \lipsum[10]
  \lipsum[11]
  \lipsum[12]
  \lipsum[13]
}

\end{parcolumns}

\end{document}

我稍微修改了 parcolumns 包中的宏\pc@placeboxes,以便它能够区分奇数页和偶数页。实际检查是使用changepage包中的宏完成的,这就是为什么它会被加载到序言中。您必须至少编译两次,因为这依赖于页面标签。

我认为,最终的输出就是您想要的,即每次分页时列都会交换:

在此处输入图片描述 在此处输入图片描述

我没有在意边注,你可能会遇到副作用。如果是这样的话,你最好提出一个新问题,一次解决一个问题。

编辑(2012 年 7 月 22 日)

parcolumns 包的工作分为两个步骤:首先,将每列的内容排版到框中。这是通过命令完成的\colchunk。其次,对于输出页面上的每一行,从每个列框中提取一行并将其放置在页面上。这是通过宏完成的 \pc@placeboxes

因此,假设N有列,原始\pc@placeboxes原则上会执行以下操作:对于i=1直到i=N第 1 行的 列i,将框剪切并粘贴到页面上。如果i<N插入列分隔空间。

我只是挂接了这个宏,并每隔一页反转一次顺序:修改后的操作\pc@placeboxes与奇数页的原始操作完全相同。但是,对于偶数页,当从列框中剪切和粘贴行时,它会从i=N 下往上循环。i=1

这个问题wrapfig很可能源于这种两步方法。我没有研究过这个wrapfig包,我只能猜测它用来\parshape修改排版段落的形状。这将影响排版到列框中的内容。显然,当列框的行分布在页面上时,事情就会出错。不幸的是,我目前无法为这个问题提供解决方案(实际上我希望这里的一些 TeX 专家能给你一个建议)。

相关内容