在处理后的文档顶部写入文章类的 TeX 文件名

在处理后的文档顶部写入文章类的 TeX 文件名

考虑以下 MWE。

\documentclass{article}
\usepackage{textpos}
\newcommand{\insertname}{%
  \begin{textblock}{2}(5,-0.5)
    \bfseries{\jobname.tex}
  \end{textblock}
}
\begin{document}
\insertname
Some text.
\end{document}

这会将 LaTeX 文件的名称放在输出 PDF 的顶部。但是,xpatch如果可能的话,我希望使用 来自动处理。这样我就不需要手动将宏插入正文中,而是在序言中处理它。我尝试过依次使用\xpretocmdwith\maketitle\titlepageas 参数,但不起作用。有什么建议可以告诉我该怎么做吗?

\documentclass{article}
\usepackage{textpos}
\usepackage{xpatch}
\newcommand{\insertname}{%
  \begin{textblock}{2}(5,-0.5)
    \bfseries{\jobname.tex}
  \end{textblock}
}
\xpretocmd{\maketitle}{\insertname}{}{}
%\xpretocmd{\titlepage}{\insertname}{}{}
\begin{document}
%\insertname
Some text.
\end{document}

tohecz 的答案看起来不错,但不适用于简单的字母示例。

\documentclass[11pt]{letter}
\address{Sender address}
\signature{Some person}

\usepackage{fancyhdr}
\fancyhf{}
\fancyhead[RO,LE]{\jobname\quad\the\day.~\the\month.~\the\year}
\pagestyle{fancy}

\begin{document}
\begin{letter}{Recipient address}

\opening{Dear Sir/Madam,}

Some stuff

\closing{Thanking you}
\end{letter} 
\end{document}

答案1

像这样

\documentclass[a4paper]{memoir}
% picture loaded to be able to use 'units in \put
\usepackage{eso-pic,picture}
\AddToShipoutPictureBG*{
  % change reference point to page upper left
  \AtPageUpperLeft{
    \put(1cm,-1cm){\textbf{\jobname}}
  }
}
% this is just to have some contents
\usepackage{lipsum}
\begin{document}
\lipsum
\end{document}

\AddToShipoutPictureBG*刚刚添加到下一个已发货页面。删除后*它将添加到所有页面。


居中版本

\documentclass[a4paper]{memoir}
% picture loaded to be able to use 'units in \put
\usepackage{eso-pic,picture,calc}
\AddToShipoutPictureBG*{
  % change reference point to page upper left
  \AtPageUpperLeft{
    \put(\oddsidemargin+1in+0.5\textwidth,-1cm){%
      \makebox[0pt][c]{\textbf{\jobname}}}
  }
}
% this is just to have some contents
\usepackage{lipsum}
\begin{document}
\lipsum
\end{document}

答案2

你需要使用 \maketitle如果您希望\insertname执行该操作,则

但是,如果在文档中使用,那么简单的解决方案\AtBeginDocument{\insertname}将不起作用,因为。\maketitle\maketitle\newpage

\maketitle如果您不打算在文档中使用,则需要更复杂的解决方法。如果您打算使用它,那么\@maketitle需要修补的宏是:

\makeatletter
\xpatchcmd{\@maketitle}{\newpage}{\newpage\insertname}{}{\ddt}
\makeatother

so\insertname在 之后执行\newpage

如果您希望它独立于的存在\maketitle,唯一可靠的方法似乎是使用合适的页面样式。

\documentclass{article}
\usepackage{xpatch}
\makeatletter
\def\ps@faheem{%
  \let\@mkboth\@gobbletwo
  \def\@oddhead{\hfil\textbf{\jobname.tex}}%
  \def\@oddfoot{\reset@font\hfil\thepage\hfil}%
  \let\@evenhead\@empty\let\@evenfoot\@oddfoot
}
\AtBeginDocument{\thispagestyle{faheem}}
\xpatchcmd{\maketitle}{plain}{faheem}{}{}
\makeatother

\begin{document}
\title{A}\author{B}
\maketitle
Some text.
\end{document}

如果您发表评论,\maketitle您将获得相同的标题。


为了完整性,这里有一个不同的策略atbegshi

\documentclass{article}
\usepackage{atbegshi,picture}
\newcommand{\insertname}{%
  \put(\dimexpr\oddsidemargin+1in+\textwidth,-1cm){%
    \makebox[0pt][r]{\textbf{\jobname.tex}}%
  }%
  \gdef\insertname{}%
}
\AtBeginShipout{%
  \AtBeginShipoutUpperLeft{\insertname}%
}

\begin{document}
\title{A}\author{B}
\maketitle
\end{document}

修改放置参数;通过此设置,文件名的右边缘与右边距齐平,基线距纸张顶部 1 厘米。

答案3

我是否遗漏了什么,或者您可以像我经常做的那样简单地使用标准标题?

\usepackage{fancyhdr}
\fancyhf{}
\fancyhead[RO,LE]{\jobname\quad\the\day.~\the\month.~\the\year}
\pagestyle{fancy}

这会将\jobname和编译日期插入到每页的页眉中。如果您的页眉中已有内容,并且想要将其放在稍高的位置,则可以使用以下构造:

\usepackage{fancyhdr}
\usepackage{mathtools}
\newcommand\jobinhead{\jobname\quad\the\day.\the\month.\the\year}
\fancyhead[RO]{%
  blabla%
  \smash{\raisebox{\baselineskip}{\llap{\jobinhead}}}%
}
\fancyhead[LE]{%
  \leavevmode
  \smash{\raisebox{\baselineskip}{\rlap{\jobinhead}}}%
  blabla%
}
\pagestyle{fancy}

如果不想加载mathtools,可以通过\llap{abc}和来模拟\rlap{abc}\hbox to 0pt{\hss abc}\hbox to 0pt{abc\hss}

相关内容