我想知道是否有一个包可以帮助我设置自定义页眉,就像图片中的一样。
我对 Latex 还很陌生,我使用 fancyhdr 让它工作,但在设置边距和对齐文本时遇到了麻烦。我正在寻找一种更简单、更轻松的方法来实现相同的结果。
我正在使用 Pandoc(使用 markdown + latex),因为我需要同一个文件的 pdf 副本和 .docx 副本,因此如果该解决方案也适用于 MS Word 页眉,则可以获得加分。
编辑以添加代码:
\documentclass[a4paper]{article}
%% Language and font encodings
\usepackage[english]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
%% Sets page size and margins
\usepackage[a4paper]{geometry}
%% load packages
\usepackage{multirow}
\usepackage{array}
\usepackage{lastpage}
\usepackage{fancyhdr}\pagestyle{fancy}
\usepackage[owncaptions,tablegrid]{vhistory}
\usepackage{lipsum}
\newsavebox{\myTitleBlock}
\begin{lrbox}{\myTitleBlock}
\begin{minipage}{\textwidth}
\renewcommand{\arraystretch}{3}
\begin{tabular}{|p{5cm}|p{2,5cm}|p{2,5cm}|p{2,5cm}|p{2,5cm}|}
\hline
\multirow{2}{*}{\raggedleft{\shortstack{\textbf{Company}\\Address\\0001 New York NY}}} & \multicolumn{4}{l|}{Some text here} \\
\cline{2-5} & \multicolumn{1}{l|}{Form xx} & Rev. \vhCurrentVersion & dd/mm/yyyy & Page \thepage{} of \pageref{LastPage} \\
\hline
\end{tabular}
\end{minipage}
\end{lrbox}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
\chead{\usebox{\myTitleBlock}
\lhead{}
\rhead{}}
\begin{document}
\begin{versionhistory}
%<Version> <Date> <Authors> <Changes>}
\vhEntry{1.1}{13.05.04}{JW|AK|KL}{Typos corrected.}
\vhEntry{1.0}{22.01.04}{JPW|KW}{created}
\vhEntry{1.1}{23.01.04}{DP|JPW}{correction}
\vhEntry{1.2}{03.02.04}{DP|JPW}{revised after review}
\end{versionhistory}
%the version number of the last entry
Last revision: \vhCurrentVersion
%Include a table of contents
\setcounter{tocdepth}{4}
\tableofcontents
\lipsum{2-5}
\end{document}
背面:https://www.overleaf.com/6834124pxvthzbvjmvt#/23296145/
如您所见,问题如下:
- 第 x 页,共 ?? 页。它在文档内部运行,但在页眉中是 ??。
- 我不知道如何将地址左对齐
- 我想扩展页眉以填充 A4 纸的宽度,但保留正文的实际边距。还要减少一点顶部边距。更一般地说,我想为页眉和文本指定不同的边距。
- 页眉和内容在第一页重叠
- 最后但并非最不重要的一点是,代码很复杂。寻找更直观的东西。
答案1
- 第 x 页,共 ?? 页。它在文档内部运行,但在页眉中是 ??。
迈克尔·帕尔默已经部分解释了第一个问题:将标题保存到框中会“冻结”其内容,这不是您想要的页码。这就是为什么它总是第 1 页而不是第 2 页。因为最后一页的引用在序言中是未知的 - 因为.aux
尚未读取上次运行的文件(如果有) - 此时最后一页始终是未解决的交叉引用。如果您在之后指定标题\begin{document}
,这应该可以工作。但你仍然会永远停留在第 1 页。
请注意此代码
\chead{\usebox{\myTitleBlock}
\lhead{}
\rhead{}}
没有意义。您已在中心标题的规范中指定了左标题和右标题。
- 我不知道如何将地址左对齐
是\shortstack
居中。tabular
我想我会在这里使用。(好吧,我可能不会,因为我不会这么做,但如果我要这么做,我可能会这么做。)
- 我想扩展页眉以填充 A4 纸的宽度,但保留正文的实际边距。还要减少一点顶部边距。更一般地说,我想为页眉和文本指定不同的边距。
这分为几个部分。要更改页眉宽度,我们需要查看fancyhdr
。要更改页面尺寸, including the height of the header, we need to look at
几何。要创建跨宽度的表格,我们可以使用tabularx
。为了防止出现坏框,我们可以对其宽度进行编造。
- 页眉和内容在第一页重叠
您需要在编译时阅读控制台输出或之后查阅日志。偶尔……只是偶尔,TeX 写入的所有信息都会告诉您需要知道的内容。当事情没有按预期进行时,这应该是首先要查看的内容。
这是控制台告诉我们的内容。
Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 85.79999pt.
然后它会告诉您包装正在改变尺寸,但不幸的是,对于第 1 页来说已经太晚了。所以这是我们需要改变的布局的一个方面。
- 最后但并非最不重要的一点是,代码很复杂。寻找更直观的东西。
消除框会有所帮助。我还会消除minipage
并简化表格规范。你有完全没有意义的\multicolumn
s,所以他们可以走了。
这是一个例子。这仍然会产生一个坏框,但这是由版本历史环境引起的,而不是这个问题的一部分。
\documentclass[a4paper]{article}
\usepackage[british]{babel}% or american or ...
\usepackage[utf8]{inputenc}% don't use utf8x
\usepackage[T1]{fontenc}
\usepackage{geometry}% no need to repeat papersize here
\usepackage{multirow}
\usepackage{array,calc,tabularx}
\usepackage{lastpage}
\usepackage{fancyhdr}
\usepackage[owncaptions,tablegrid]{vhistory}
\usepackage{lipsum}
\pagestyle{fancy}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
\fancyheadoffset{25.4mm+\leftmargin}
\chead{%
\centering
\renewcommand{\arraystretch}{3}%
\begin{tabularx}{\paperwidth}{|p{5cm}|*{4}{X|}}% use something other than \paperwidth if you didn't really mean this - I've implemented what you asked for, even though I don't see why you want vertical rules at the ends in this case
\hline
\multirow{2}{*}{\renewcommand{\arraystretch}{1}\bfseries\begin{tabular}{@{}l@{}}Company \\ Address \\ 0001 New York NY\end{tabular}} & \multicolumn{4}{c|}{Some text here} \\ % tabular is simpler and deals automatically with the alignment @{} avoid additional horizontal space
\cline{2-5} & Form xx & Rev.\ \vhCurrentVersion & dd/mm/yyyy & Page \thepage{} of \pageref{LastPage} \\ % no need for a multicolumn here
\hline
\end{tabularx}%
}
\lhead{}% not part of the central header spec!
\rhead{}
\geometry{headheight=86pt}% change margins etc. here e.g. top=10mm for a 10mm top margin etc. - but I don't think you should make the top margin *less*!
\begin{document}
\begin{versionhistory}% this causes an underfull box with infinite badness as far as I can tell.
\vhEntry{1.1}{13.05.04}{JW|AK|KL}{Typos corrected.}
\vhEntry{1.0}{22.01.04}{JPW|KW}{created}
\vhEntry{1.1}{23.01.04}{DP|JPW}{correction}
\vhEntry{1.2}{03.02.04}{DP|JPW}{revised after review}
\end{versionhistory}
Last revision: \vhCurrentVersion
\setcounter{tocdepth}{4}
% nothing to see here - why is this in the minimal example?
\tableofcontents
\lipsum{2-5}
\end{document}
答案2
标题保存框的内容在文档开始之前就会被冻结,然后每次粘贴时都保持不变。如果您取消保存框:
% changes affecting table layout
\usepackage{calc} % for setting table dimensions relative to \textwidth
% change parameters for package geometry to make space for big header
\usepackage[a4paper,margin=1in,tmargin=2in,headheight=2in]{geometry}
% change code for header generation
\newcommand{\makeheader}{
\begin{minipage}{\textwidth}
\renewcommand{\arraystretch}{3}
\begin{tabular*}{\textwidth}[t]{@{\extracolsep{\fill}}|p{0.3\textwidth}|p{0.15\textwidth}|p{0.15\textwidth}|p{0.15\textwidth}|p{0.15\textwidth}|}
\hline
\multirow{2}{*}{\raggedleft{\shortstack{\textbf{Company}\\Address\\0001 New York NY}}} & \multicolumn{4}{l|}{Some text here} \\
\cline{2-5} & \multicolumn{1}{l|}{Form xx} & Rev. \vhCurrentVersion & dd/mm/yyyy & Page \thepage{} of \pageref{LastPage} \\
\hline
\end{tabular*}
\end{minipage}}
\chead{\makeheader}
页面计数器起作用了。
顺便问一下,您确定列宽规范中的逗号吗?通常使用小数点,但也许您加载了一些使逗号也能工作的包(?虽然我不知道有任何这样的包)。
编辑:我还稍微改变了表格和页面的尺寸。