如何检查 \thepage 是否被吞噬?

如何检查 \thepage 是否被吞噬?

我使用\pagenumbering{gobble}来隐藏某些页面的页码。我还使用fancyhdrlastpage包来显示其他页面的页码,例如 -

Page \thepage of \pageref{LastPage}

然而,对于被吞噬的页面,它会显示类似这样的内容 -

Page of 4 %only last page number is shown

当它被吞噬时我想把整个东西藏起来\thepage

到目前为止我已经尝试过 -

\rfoot{\ifnum \thepage>0 Page~\thepage~of~\pageref{LastPage}\else \fi}

\newpage它可以按预期进行编译和工作,但是遇到问题时会出现错误消息。

缺失数字,视为零。\newpage

\@ifundefined我也尝试过按照这个建议使用回答但无法让它工作

有人可以提出一些想法吗?

这是一个可编译的示例文档源。

\documentclass[11pt,a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage[left=1.00in, right=1.00in, top=1.00in, bottom=1.00in]{geometry}
\usepackage{fancyhdr}
\usepackage{lastpage}

\pagestyle{fancy}

\renewcommand{\footrulewidth}{0.4pt}% default is 0pt

\lhead{}
\chead{}
\rhead{}

\lfoot{}
\cfoot{}
\rfoot{\ifnum \thepage>0 Page~\thepage~of~\pageref{LastPage}\else \fi}

\begin{document}
    \pagenumbering{gobble}
    First Page
    \newpage
    Second Page
    \newpage
    \pagenumbering{arabic}
    Third Page
    \newpage
    Forth Page
\end{document}

我在 Windows 上使用portable miketex

答案1

请参阅答案末尾的更新

使用\meaning\thepage表明

\thepage定义为\csname @gobble\endcsname \c@page

如果\pagenumbering{gobble}被应用。

此定义可用于\ifx...条件语句中,以检查是否已完成此操作,即

\makeatletter
    \rfoot{\def\foo{\csname @gobble\endcsname \c@page}
    \ifx\thepage\foo
    % Yes, it is gobbled!
    % Perhaps some other statement here? 
    \else 
    Page \thepage{} of \pageref{LastPage}%
    \fi
 }% End of \rfoot
\makeatother

对于具有 的宏名称,\makeatletter...\makeatother需要有对。\@gobble@

\documentclass[11pt,a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage[left=1.00in, right=1.00in, top=1.00in, bottom=1.00in]{geometry}
\usepackage{fancyhdr}
\usepackage{lastpage}

\pagestyle{fancy}

\renewcommand{\footrulewidth}{0.4pt}% default is 0pt

\lhead{}
\chead{}
\rhead{}

\lfoot{}
\cfoot{}
\makeatletter
\rfoot{\def\foo{\csname @gobble\endcsname \c@page}\ifx\thepage\foo\else Page \thepage{} of \pageref{LastPage}\fi}
\makeatother

\begin{document}
    \pagenumbering{gobble}
    First Page
    \newpage
    Second Page
    \newpage
    \pagenumbering{arabic}
    Third Page
    \newpage
    Forth Page
\end{document}

更新--有一些改进

可以存储活动\thepage时的定义gobble并在稍后进行比较。

为了简化输出格式,我定义了两个钩子,\@gobble@thepagehook如果 gobbling 处于活动状态,则应执行这两个钩子,如果未设置,则\@nogobble@thepagehook这两个钩子将起作用。请参阅相关代码部分。gobble

\documentclass[11pt,a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage[left=1.00in, right=1.00in, top=1.00in, bottom=1.00in]{geometry}
\usepackage{fancyhdr}
\usepackage{lastpage}

\pagestyle{fancy}
\renewcommand{\footrulewidth}{0.4pt}% default is 0pt
\fancyhf{}

\pagenumbering{gobble}
\makeatletter
\let\gobble@thepage\thepage
\rfoot{%
  \ifx\gobble@thepage\thepage
  \@gobble@thepagehook%
  \else
  \@nogobble@thepagehook%
  \fi
}

%\let\@gobble@thepagehook\relax% For real gobbling
\newcommand{\@gobble@thepagehook}{\textbf{I am gobbled}}% For code golfing :-P
\newcommand{\@nogobble@thepagehook}{%
  Page \thepage{} of \pageref{LastPage}%
}

\makeatother
\pagenumbering{arabic}

\begin{document}
    \pagenumbering{gobble}
    First Page
    \newpage
    Second Page
    \newpage
    \pagenumbering{arabic}
    Third Page
    \newpage
    Forth Page
\end{document}

在此处输入图片描述

答案2

虽然\pagenumbering{gobble}在某些情况下这是一个有用的技巧,但您最好定义一个真正的页面样式:

\documentclass[11pt,a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage[left=1.00in, right=1.00in, top=1.00in, bottom=1.00in]{geometry}
\usepackage{fancyhdr}
\usepackage{lastpage}

\pagestyle{fancy}

\renewcommand{\footrulewidth}{0.4pt}% default is 0pt

\lhead{}
\chead{}
\rhead{}

\lfoot{}
\cfoot{}
\rfoot{Page~\thepage~of~\pageref{LastPage}}

\fancypagestyle{emptywithlines}{%
 \pagestyle{fancy}%
 \rfoot{}}

\begin{document}
    \pagestyle{emptywithlines}
    First Page
    \newpage
    Second Page
    \newpage
    \pagenumbering{arabic}% if page numbering should start by 1
    \pagestyle{fancy}
    Third Page
    \newpage
    Forth Page
\end{document}

相关内容