更改序言中的页码 - 乳胶计数器修改 - 十六进制转换

更改序言中的页码 - 乳胶计数器修改 - 十六进制转换

EDIT2:抱歉,这些实时更新,但我真的快疯了。我在底部添加了使用 showhexapagesStepOne 正确编译的新代码

我编辑了这个问题,试图为整个努力提供更多的笛卡尔组织。还更改了提供的代码,使其更接近正确性(我希望)。

我想使用标准书籍文档并更改 fancyhdr 中的页面编号。特别是,我希望页面以十六进制样式 0xABCD 打印。我几乎尝试了所有方法(我不会在这里发布所有代码尝试,因为这会很尴尬),即:

  1. pythonTex(紧随immediatepython之后):在计数器真正更新到文档之前,尝试传递LaTex计数器时卡住了。两天后我放弃了。
  2. hex 包(由 Eric Domenjoud 编写,非常老了),但它仍然使用 documentstyle,而我却无法转换旧的 /usename 指令
  3. 也尝试了 binhex 包,但问题相同:计数器扩展。现在我尝试让它与 fmtcount 包一起工作。

我的序言在文档开始之前包含这个花哨的标题部分(在它的顶部有一些使用计数器的实验):

\newcounter{hexapages}


\newcommand\showhexapagesStepOne{%
\setcounter{hexapages}{\thepage}%
\thehexapages%
}

\newcommand\showhexapagesStepTwo{% If I make showhexapagesStepOne work, this will work as well
\setcounter{hexapages}{\thepage}%
\HEXADecimal(hexapages)% or maybe thehexapages ???
}


\setlength{\headheight}{15pt}

\pagestyle{fancy}
\renewcommand{\chaptermark}[1]{ \markboth{#1}{} }
\renewcommand{\sectionmark}[1]{ \markright{#1} }

\fancyhf{}
%\fancyhead[LE]{{\thepage}} %obviously compiles
%\fancyhead[RO]{{\thepage}} %obviously compiles
\fancyhead[LE]{{\showhexapagesStepOne}} % does not compile
\fancyhead[RO]{{\showhexapagesStepOne}} % does not compile
\fancyhead[RE]{\textit{ \nouppercase{\leftmark}} }
\fancyhead[LO]{\textit{ \nouppercase{\rightmark}} }
\fancyheadoffset[LE]{14mm} 

当前错误为:(foreword.tex!缺少数字,视为零。i l.9

[我认为 Latex 正尝试将转换应用于以罗马风格编号的内容……所以我应该区分前言和正文……]

似乎失败的是尝试将任何计数器(预定义为 \thepage 或自定义为 \thehexapages)传递到任何花式标题的占位符中。

第一次使用 PythonTex 的尝试是创建一个宏,将任意数字转换为十六进制,但当参数变成计数器时失败。

我该怎么做?为什么 fancyheader 会接受 \thepage 而拒绝其他任何操作?如果尝试 HEXADecimalnum{459},它会正确打印“1CB”。因此,不是 fmtcount 包出了问题。

EDIT2 开始:新代码是:

\newcounter{hexapages}

\newcommand\showhexapagesStepOne{%
\setcounter{hexapages}{\thepage}%
\thehexapages%
}

\newcommand\showhexapagesStepTwo{%
\setcounter{hexapages}{\thepage}%
\HEXADecimal(hexapages)% or maybe thehexapages ???
}


\setlength{\headheight}{15pt}

\pagestyle{fancyplain}
\fancyhf{}


\fancypagestyle{plain}{ %
  \fancyhf{} % remove everything
  \renewcommand{\headrulewidth}{0pt} % remove lines as well
  \renewcommand{\footrulewidth}{0pt}
}

\pagestyle{fancy}
\fancyhf{}
\renewcommand{\chaptermark}[1]{ \markboth{#1}{} }
\renewcommand{\sectionmark}[1]{ \markright{#1} }
%\fancyhead[LE]{{\thepage}}
%\fancyhead[RO]{{\thepage}}
\fancyhead[LE]{{\showhexapagesStepOne}}
\fancyhead[RO]{{\showhexapagesStepOne}}
\fancyhead[RE]{\textit{ \nouppercase{\leftmark}} }
\fancyhead[LO]{\textit{ \nouppercase{\rightmark}} }
\fancyheadoffset[LE]{14mm}% slightly less than 0.25in
\fancyheadoffset[RO]{14mm}%
\renewcommand{\headrulewidth}{0pt} % remove lines as well
\renewcommand{\footrulewidth}{0pt}

% and after all the preamble definitions.....


\frontmatter 
\pagestyle{plain}
\include{dedication}
\include{foreword}
\include{preface}
\include{acknowledgement}

\tableofcontents

\include{acronym}



\mainmatter%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\pagestyle{fancy}
\fancyhf{}
\renewcommand{\chaptermark}[1]{ \markboth{#1}{} }
\renewcommand{\sectionmark}[1]{ \markright{#1} }
%\fancyhead[LE]{{\thepage}}
%\fancyhead[RO]{{\thepage}}
\fancyhead[LE]{{\showhexapagesStepTwo}}
\fancyhead[RO]{{\showhexapagesStepTwo}}
\fancyhead[RE]{\textit{ \nouppercase{\leftmark}} }
\fancyhead[LO]{\textit{ \nouppercase{\rightmark}} }
\fancyheadoffset[LE]{14mm}% slightly less than 0.25in
\fancyheadoffset[RO]{14mm}%
\renewcommand{\headrulewidth}{0pt} % remove lines as well
\renewcommand{\footrulewidth}{0pt}

这样,我就可以删除前言中的任何标题和编号,只为正文保留花哨的样式。重点是:现在它使用 showhexapagesStepOne 正确地在 LE 和 RO 角度打印阿拉伯数字。当我切换到 StepTwo(包含转换的那个)时,我收到错误:

! You can't use `\relax' after \the.
<recently read> \c@(

有什么线索吗?

答案1

这是一个以十六进制格式打印页码的相当通用的方法,具有完全可扩展的命令。

\documentclass{article}

\usepackage[a6paper]{geometry} % just to show several pages
\usepackage{lipsum} % filler text

\usepackage{fancyhdr}

\fancyhf{}
\fancyfoot[C]{\texttt{\thepage}}
\renewcommand{\headrulewidth}{0pt}
\pagestyle{fancy}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\printhex}{O{4}m}
 {% #1 = number of digits, #2 = integer
  0x
  \prg_replicate:nn { #1 - \tl_count:e { \int_to_Hex:n { #2 } } } { 0 }
  \int_to_Hex:n { #2 }
 }
\cs_generate_variant:Nn \tl_count:n { e }

\ExplSyntaxOff

\renewcommand{\thepage}{\printhex{\value{page}}}

\begin{document}

\raggedright % don't bother with overfull boxes

\lipsum

\clearpage

\setcounter{page}{6700}

\lipsum

\end{document}

在图片中我展示了前后两个页面\clearpage,为了显示第 6700 页正确显示为0x1A2C

在此处输入图片描述

答案2

\hex命令需要一个数字作为其参数。当您使用类似 的内容时\hex{\thepage},您应该记住 是\thepage上下文敏感的。\frontmatter它不会打印数字。相反,它会打印字母。要了解我的意思,请尝试以下操作:

\documentclass{book}

\begin{document}
\frontmatter
\verb|\thepage| prints \thepage.

\mainmatter
\verb|\thepage| prints \thepage.
\end{document}

因此,当处于活动状态时,类似的东西\hex{\thepage}显然会给你一个Missing number错误\frontmatter,因为,嗯,实际上缺少一个数字!:)

因此解决方案可以是很多更简单:

\documentclass{book}
\usepackage{fancyhdr}
\usepackage{lipsum}
\input{binhex}
\pagestyle{fancy}

\begin{document}
\frontmatter
\pagenumbering{arabic}% \thepage will produce numbers.
\cfoot{\hex{\thepage}}
\lipsum[1-50]
\end{document}

我不太了解十六进制的编号方式,但我可以看到A第 10 页。所以我认为它是有效的。

答案3

Ganzo!我刚刚成功发布了这个耗费生命力的问题的答案,而 Niranjan 发表了评论。我找到了一个带有fmtcount软件包的解决方案,但他没有。Niranjan 使用了binhex。这怎么可能?我放弃了!所以,我再次尝试从我最新的解决方案(我用来写答案的那个)开始,包括他关于的精彩提示binhex。实际上binhex从根本上来说更好因为它填充了所需的对齐方式只需几秒钟!事实上,下面是使用这两个包的解决方案。我将使用binhex按照评论中的建议使用。真的感谢!

%----------------------------------------------------------------------------------------
%   HEADERS & FOOTERS
%----------------------------------------------------------------------------------------


% hexadecimal page numbers
  
\newcommand\showhexapagesStepTwo{%
%0x\HEXADecimal{hexapages} % this can work but it does not pad to any alignment
0x\nhex{4}{\thepage}
}


\setlength{\headheight}{15pt}

\pagestyle{fancyplain}
\fancyhf{}


\fancypagestyle{plain}{ %
  \fancyhf{} % remove everything
  \renewcommand{\headrulewidth}{0pt} % remove lines as well
  \renewcommand{\footrulewidth}{0pt}
}

\pagestyle{fancy}
\fancyhf{}
\renewcommand{\chaptermark}[1]{ \markboth{#1}{} }
\renewcommand{\sectionmark}[1]{ \markright{#1} }
\fancyhead[LE]{{\showhexapagesStepTwo}}
\fancyhead[RO]{{\showhexapagesStepTwo}}
\fancyhead[RE]{\textit{ \nouppercase{\leftmark}} }
\fancyhead[LO]{\textit{ \nouppercase{\rightmark}} }
\fancyheadoffset[LE]{14mm}% slightly less than 0.25in
\fancyheadoffset[RO]{14mm}%
\renewcommand{\headrulewidth}{0pt} % remove lines as well
\renewcommand{\footrulewidth}{0pt}

甚至不需要任何代理计数器(在文档开始后放置指令\thepage后就完美了fancyhdr)。我真的不知道我做错了什么。可能在多次尝试中我把一切都搞砸了,忘记了解决方案。无论如何,这是我在 SO! 或 SE! 上找到的唯一关于这方面的问题,所以我发布了解决方案以供将来使用。

最后说明一下:真正的问题主要与嵌套的“thepage \begin{document}”的使用有关before。我认为在这种情况下需要特别注意,因为宏不应该在定义时展开,而只能在下方有实际的页面编号时展开(因此通常在 mainmatter 中)。

问候 Alex

相关内容