如何正确改变页面偏移量?

如何正确改变页面偏移量?

假设我们需要更改边距。由于默认偏移量为 1 英寸,因此无法仅通过更改\hsize和来完成此操作。可以直接更改和,但这很麻烦。是否有更通用的解决方案,使用输出例程还是其他技巧?此外,如果页面有偶数(对于双页设计),如何更改左偏移量?\vsize\hoffset\voffset

答案1

是否有更通用的解决方案,使用输出例程,或者其他技巧?

对于普通的 TeX,我所知道的唯一“更通用”的是 OPmac 宏,例如:

\input opmac
\margins/2 a5 (1,1,1,1.4)cm % A5 paper + 1cm margins in two-pages design

在这种情况下,声明的边距是奇数页的边距。偶数页的边距只是相应地镜像。运行texdoc opmac并查看第 16 节,或转到OPmac 网站了解更多信息。

对于 LaTeX,你可以使用 来触摸你能看到的低级长度的包layout\hoffset或者以更“通用”(友好、简单、容易)的方式,处理一些包的主题几何在 CTAN 中,如typeareaanysize,或者为什么不,无处不在geometry

要了解每个包的方法,请运行texdoc <package>。在这种情况下,geometry这是一种正确的方法,因为它通常有效,并且有很好的文档。对于其他包,您可能不太走运,但您始终可以运行texdoc <package>.sty(现在使用扩展)并查看源代码以了解使用了哪些方法。

如果页面数量为偶数(对于双页设计),如何更改左偏移量?

在 LaTeX 中,在文档环境中使用\layout(包中的)命令!layout

您将看到,在一篇twoside文章中,奇数页和偶数页的命令\hoffset始终是0pt相同的。但您可以更改\oddsidemargin\evensidemargin

在纯 TeX 中,您可以创建这些长度并\hoffset有条件地设置为奇数/偶数页:

% Stolen from a Dan Luecking's answer at comp.text.tex 
\newdimen\oddsidemargin
\newdimen\evensidemargin
\oddsidemargin=.25truein  
\evensidemargin=1truein  
\output={\hoffset=\ifodd\pageno\oddsidemargin\else%
\evensidemargin\fi\plainoutput}

\oddsidemargin=300pt % only to test ...
\evensidemargin=10pt

odd page 
\vfil \break
even page 
\bye

答案2

latex格式的思路是根据\moveright页面发货时的页面框的边距值来决定的。

\vsize=5\baselineskip%%

\newdimen\oddsidemargin
\newdimen\evensidemargin

\oddsidemargin=3cm
\evensidemargin=2cm

\catcode`\@11\relax
\def\plainoutput{\shipout\vbox{%
    \ifodd\pageno
          \let\mymargin\oddsidemargin
    \else
          \let\mymargin\evensidemargin
    \fi
    \moveright\mymargin \vbox{%
              \makeheadline\pagebody\makefootline}%
              }%
  \advancepageno
  \ifnum\outputpenalty>-\@MM \else\dosupereject\fi}
\catcode`\@12\relax

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales ligula in libero. 

Sed dignissim lacinia nunc. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor. Morbi lectus risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, euismod in, nibh. 

\bye 

原始输出

\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}%
  \advancepageno
  \ifnum\outputpenalty>-\@MM \else\dosupereject\fi}

答案3

我认为没有一个通用的解决方案,但是这里有一个针对水平边距的解决方案,它假设了一定的对称性(我对此并不完全满意,但还是想分享一下):

\catcode`\@=11

% XeTeX doesn't have \pdf[hv]origin (yet?)
\ifdefined\pdfhorigin
\else\csname newdimen\endcsname\pdfhorigin\pdfhorigin=1in \fi
% No \outer allowed inside the skipped conditional (TeX by Topic p. 110)
\ifdefined\pdfvorigin
\else\csname newdimen\endcsname\pdfvorigin\pdfvorigin=1in \fi

\newif\ifspread
\newdimen\bindcorr

% TODO: user could give typeblock size in relation to \pdfpagesize
\def\hmargin{
  \def\next{\hoffset=\dimexpr\dimen@-\pdfhorigin
            \hsize=\dimexpr\pdfpagewidth-2\dimen@
            \ifspread
              \hsize=\dimexpr\hsize+.5\dimen@-\bindcorr
              \dimen@ii=\dimexpr.5\dimen@+\bindcorr-\pdfhorigin
              \def\spreadoutput{\ifodd\pageno\else\hoffset=\dimen@ii
                                \fi\plainoutput}
              \output{\spreadoutput}
            \fi}
  \afterassignment\next\dimen@=}

使用示例:

\pdfpagewidth=6in
\pdfpageheight=9in
\input the_above_codeblock.tex
\spreadtrue
\hmargin 5mm
\input some_text.tex
\bye

答案4

感谢大家 - 你们的回答帮助我找到了解决方案。我之前不明白的是,\hoffset\voffset只在输出例程中被查看。我想分享我的想法。以下是宏\margins,我将其放入格式文件中并用作,例如,\margins (2.5,1,2,2)/X其中X代表1- 或2- 双面布局。

\def\margins (#1,#2,#3,#4)/#5 {%
  \hsize = 210 true mm
  \vsize = 297 true mm

  \advance\hsize by -#1 true cm
  \advance\hsize by -#2 true cm

  \advance\vsize by -#3 true cm
  \advance\vsize by -#4 true cm
  \advance\vsize by -.1 true in % as in plain.tex

  \voffset = #3 true cm
  \advance\voffset by -1 true in % annihilate default gap

  \output = {%
    \if 1#5
      \hoffset = #1 true cm
    \else
      \hoffset = \ifodd\pageno #1 true cm \else #2 true cm \fi
    \fi
    \advance\hoffset by -1 true in % annihilate default gap
    \plainoutput
  }%
}

相关内容