我在文档的草稿版本上使用初步标记,其中指定了svn
存储库编号、时间戳、URL 等。我更喜欢将其排版在页面底部、页脚下方的中心。
这是我想要实现的效果:
解决方案需要:
onecolumn
在和模式下工作twocolumn
;- 至少使用标准 LaTeX 类;
geometry
与和合作fancyhdr
;- 允许在初步标记的规范中使用 LaTeX 命令,以便我可以排版
svn
信息\today
等,并允许多行标记; - 将标记置于页脚下方的中心但在可打印区域内,即使传递给
geometry
和时也是如此fancyhdr
; - 对
draft
或final
选项是否有效很敏感; - 不得以其他方式影响页面布局,例如,不得影响分页符或换行符、页眉/页脚的对齐或位置;
- 使用 pdfLaTeX。
我一直在使用prelim2e
。但是,这并不能始终或正确地将页脚下方的标记居中。这促使我提出疑问这个问题。虽然 的效果有些奇怪geometry
,但 似乎也存在一个明显的问题,即prelim2e
无论我怎么尝试,都无法让标记在页脚下方居中。即使我坚持最简单的配置并尝试类似 的操作,情况也是如此\PrelimWords{a}
。
在搜索了这个网站和 ctan 之后,我看到了 maetra 对这个答案。该评论建议结合background
和ifdraft
。所以我尝试了以下操作:
\documentclass[draft,twocolumn]{article}
\usepackage{url,svn-multi}
\svnidlong
{$HeadURL: file:///svn/myproject/tweaked-branch/usr/local/texlive/current/texmf-dist/tex/latex/something/something.sty $}
{$LastChangedBy: cfr $}
{$LastChangedRevision: 19567 $}
{$LastChangedDate: 2014-04-16 19:46:05 +0100 (Mer, 16 Ebr 2014) $}
\usepackage[hscale=.875]{geometry}
\usepackage{ifdraft}
\makeatletter
\ifdraft{%
\usepackage[placement=bottom,scale=1,opacity=1,vshift=10mm]{background}
\@ifpackageloaded{svn-multi}{%
\newsavebox{\prelimtxt}
\sbox{\prelimtxt}{%
\parbox{\textwidth}{%
\urlstyle{sf}%
\centering \small \textsf{Draft --- \today\ --- Revision \svnrev\ --- \svnyear--\svnmonth--\svnday\ \svnhour:\svnminute:\svnsecond}\\[1em]
\centering \tiny \textsf{\svnkw{HeadURL}}\\%
}% end parbox
}% end sbox
\backgroundsetup{contents=\usebox{\prelimtxt}}
}{\backgroundsetup{contents={\centering \small \textsf{Draft --- pdf\LaTeX{}ed --- \today}}}}}{%
\providecommand{\pgfsyspdfmark}[3]{\relax}}
\makeatother
\usepackage{kantlipsum}
\begin{document}
\kant[1-5]
\end{document}
虽然我还没有在实际文档中尝试过,但结果似乎正是我想要的。事实上,输出就是我上面发布的。
然而,这确实像是用铁锤砸坚果。这个解决方案tikz
只需要我加载以在页面底部设置初步标记。我意识到这是因为background
它比更强大、更灵活prelim2e
,我真的很喜欢这个包的其他用途。在这里感觉有点矫枉过正。(请注意,我的大部分定制都致力于撤销background
通过将比例设置回 1、使用完全不透明度等方式进行)
此外,这种解决方案要求我要么忍受切换到 final 时的错误,tikz
要么在根本不使用它时加载。(上面的代码设计了一种避免这两种弊端的黑客技术,即在必要时只设置一个虚拟命令。)
有没有一种替代解决方案,既能正常工作,又能减轻一些负担?或者一种解决方法prelim2e
(从我读到的内容来看,似乎值得怀疑)?
答案1
感谢 Malipivo 的评论,我想我可以尝试eso-pic
直接使用。这是包的prelim2e
使用,但我想知道放置问题是否可能是人为的,prelim2e
而不是它本身提供的底层框架的问题eso-pic
。玩了一会儿之后,事情开始好转了……
此解决方案使用eso-pic
、calc
和ifdraft
但不需要background
或,因此tikz
。它适用于 pdfLaTeX(不仅仅是 LaTeX),将初步标记置于页脚下方的底部中心,并且不会影响布局、页面或换行。它适用于geometry
、fancyhdr
、和,onecolumn
并且由于,它对/选项twocolumn
敏感。final
draft
ifdraft
我确信其中存在问题,但 MWE 看起来不错……
\documentclass[draft,twocolumn,a4paper]{article}
\usepackage{url,svn-multi}
\svnidlong
{$HeadURL: file:///svn/myproject/tweaked-branch/usr/local/texlive/current/texmf-dist/tex/latex/something/something.sty $}
{$LastChangedBy: cfr $}
{$LastChangedRevision: 19567 $}
{$LastChangedDate: 2014-04-16 19:46:05 +0100 (Mer, 16 Ebr 2014) $}
\usepackage{ifdraft}
\makeatletter
\AtBeginDocument{%
\ifdraft{%
\usepackage{eso-pic}
\usepackage{calc}
\newsavebox{\prelimtxt}
\@ifpackageloaded{svn-multi}{%
\sbox{\prelimtxt}{%
\parbox[t]{\textwidth}{%
\urlstyle{sf}%
\centering
\sffamily
\small
Draft --- \today\ --- Revision \svnrev\ --- \svnyear--\svnmonth--\svnday\ \svnhour:\svnminute:\svnsecond\\[.5em]
\tiny
\svnkw{HeadURL}\\%
}% end parbox
}% end sbox
}{%
\sbox{\prelimtxt}{%
\parbox[t]{\textwidth}{%
\centering \small \textsf{Draft --- pdf\LaTeX{}ed --- \today}%
}% end parbox
}% end sbox
}% end ifpackageloaded
\AddToShipoutPictureBG{%
\begingroup
\settototalheight{\@tempdima}{\usebox{\prelimtxt}}%
\setlength{\@tempdimb}{.5\paperwidth-.5\textwidth}%
\setlength{\@tempdimc}{.5\paperheight-.5\textheight-.5\headheight-.5\headsep-.5\footskip-.5\@tempdima}%
\put(\LenToUnit{\@tempdimb},\LenToUnit{\@tempdimc}){%
\usebox{\prelimtxt}}%
\endgroup
}% end AddToShipoutPictureBG
}{}% end ifdraft
}
\makeatother
\usepackage[hscale=.875]{geometry}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\fancyhf[lh]{\emph{Immanuel Kant}}
\fancyhf[rh]{\emph{My Musings}}
\fancyhf[cf]{\emph{--- \thepage ---}}
\usepackage{kantlipsum}
\begin{document}
\kant[1-5]
\end{document}
我认为,下面的代码处理的是使用环境以横向排版选定页面的情况landscape
。代码已showframe
设置geometry
,这在第 2 页(横向)上给出了非常令人费解的结果。无论如何,这非常糟糕。真的没有比我的更好的解决方案了吗?!
\documentclass[draft,a4paper]{article}
\usepackage{url,svn-multi}
\svnidlong
{$HeadURL: file:///svn/myproject/tweaked-branch/usr/local/texlive/current/texmf-dist/tex/latex/something/something.sty $}
{$LastChangedBy: cfr $}
{$LastChangedRevision: 19567 $}
{$LastChangedDate: 2014-04-16 19:46:05 +0100 (Mer, 16 Ebr 2014) $}
\usepackage{ifdraft}
\usepackage{pdflscape}
\makeatletter
\AtBeginDocument{%
\ifdraft{%
\usepackage{eso-pic}
\usepackage{calc}
\newlength{\origtextwidth}%
\newlength{\origtextheight}%
\setlength{\origtextwidth}{\textwidth}%
\setlength{\origtextheight}{\textheight}%
\newsavebox{\prelimtxt}
\@ifpackageloaded{svn-multi}{%
\sbox{\prelimtxt}{%
\parbox[t]{\textwidth}{%
\urlstyle{sf}%
\centering
\sffamily
\small
Draft --- \today\ --- Revision \svnrev\ --- \svnyear--\svnmonth--\svnday\ \svnhour:\svnminute:\svnsecond\\[.5em]
\tiny
\svnkw{HeadURL}\\%
}% end parbox
}% end sbox
}{%
\sbox{\prelimtxt}{%
\parbox[t]{\textwidth}{%
\centering \small \textsf{Draft --- pdf\LaTeX{}ed --- \today}%
}% end parbox
}% end sbox
}% end ifpackageloaded
\AddToShipoutPictureBG{%
\begingroup
\settototalheight{\@tempdima}{\usebox{\prelimtxt}}%
\setlength{\@tempdimb}{.5\paperwidth-.5\origtextwidth}%
\setlength{\@tempdimc}{.5\paperheight-.5\origtextheight-.5\headheight-.5\headsep-.5\footskip-.5\@tempdima}%
\put(\LenToUnit{\@tempdimb},\LenToUnit{\@tempdimc}){%
\usebox{\prelimtxt}}%
\endgroup
}% end AddToShipoutPictureBG
}{}% end ifdraft
}
\makeatother
\usepackage[hscale=.875,showframe]{geometry}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\fancyhf[lh]{\emph{Immanuel Kant}}
\fancyhf[rh]{\emph{My Musings}}
\fancyhf[cf]{\emph{--- \thepage ---}}
\usepackage{kantlipsum}
\begin{document}
\kant[1-5]
\begin{landscape}
\kant[6-10]
\end{landscape}
\kant[11-20]
\end{document}
这是由 Malipivo 的评论引发的,即\textwidth=\textheight
在景观运输环境中。这由上面第 2 页的框架说明。尽管如此,我能想出的唯一正确放置标记的方法是将文档开头的长度保存在宏中,以便在运输环境中用作常量。(我也尝试过修改环境landscape
。虽然这有效,但我认为它没有任何好处。)
答案2
由于原帖作者意识到有一个已知的问题被称为“设计妥协”之间lscape
/pdflscape
和geometry
包裹(我知道兹德涅克·瓦格纳,作者zwpagelayout
包裹,亲自,我会用他的包裹而不是geometry
在正常情况下,我很喜欢从固定位置转移,但还是试图寻找另一种策略。
我使用以下方式重新定义页脚中心,将所有信息直接放在页码下方:fancyhdr
包。我不需要eso-pic
也不calc
软件包不再可用。它运行良好,但我们正在丢失环境中的最后一页landscape
。如果我们更改以下任一操作,它就会再次运行:
\usepackage[hscale=.875]{geometry}
至\usepackage{geometry}
,或,- 我们用 关闭
twocolumn
该行中的参数\documentclass
。
我找到了一个补丁:让我们使用\onecolumn
before\begin{landscape}
和\twocolumn
after \end{landscape}
。它改进了很多,但还有一个问题需要解决,那就是我们的landscape
环境中还没有两列。我们可以在这个环境中尝试\twocolumn
,但我们会看到两列相互重叠。因此我打开了包multicol
,我们得到了这个结果。
我附上了一个示例和 8 页的预览,我们可以运行任何主要latex
引擎。它适用于lscape
和pdflscape
包。
% run: *latex mal-hsize.tex
\documentclass[draft,twocolumn,a4paper]{article} % draft twocolumn
\usepackage[hscale=.875]{geometry} %[hscale=.875]
\usepackage{multicol}
\usepackage{pdflscape}
\usepackage{url}
\usepackage{svn-multi}
\ifx\svnidlong\undefined
\relax
\else
\svnidlong
{$HeadURL: file:///svn/myproject/tweaked-branch/usr/local/texlive/current/texmf-dist/tex/latex/something/something.sty $}
{$LastChangedBy: cfr $}
{$LastChangedRevision: 19567 $}
{$LastChangedDate: 2014-04-16 19:46:05 +0100 (Mer, 16 Ebr 2014) $}
\fi
\def\measureme{%
\scrollmode % show me information...
\typeout{%
page: \thepage^^J%
textwidth and textheight: \the\textwidth, \the\textheight,^^J%
pdfpagewidth and pdfpageheight: \the\pdfpagewidth, \the\pdfpageheight%
}% End of \typeout...
\batchmode % don't show me new information...
}% End of \measureme...
\usepackage{ifdraft}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\fancyhf[lh]{\emph{Immanuel Kant}}
\fancyhf[rh]{\emph{My Musings}}
%\fancyhf[cf]{\emph{--- \thepage ---}}
\ifdraft{%
\newbox\malbox
\ifx\svnidlong\undefined
\setbox\malbox=\hbox{%
\parbox[t]{\textwidth}{%
\centering \small \textsf{Draft --- pdf\LaTeX{}ed --- \today}%
}% End of \parbox...
}% End of \setbox...
\else
\setbox\malbox=\hbox{%
\parbox[t]{\textwidth}{%
\urlstyle{sf}%
\centering
\sffamily
\small
Draft --- \today\ --- Revision \svnrev\ --- \svnyear--\svnmonth--\svnday\ \svnhour:\svnminute:\svnsecond\\[.5em]
\tiny
\svnkw{HeadURL}\\%
}% End of \parbox...
}% End of \setbox...
\fi
\fancyfoot[C]{\measureme\emph{--- \thepage\ --- \\[9pt] \copy\malbox}%
}%
}{\relax}% End of \ifdraft...
\usepackage{kantlipsum}
\begin{document}
\kant[1-7]
\onecolumn % a patch, part 1
\begin{landscape}
%\twocolumn :-)
\begin{multicols}{2}
\kant[6-26]
\end{multicols}
\end{landscape}
\twocolumn % a patch, part 2
\kant[1-7]
\end{document}