EDIT2:抱歉,这些实时更新,但我真的快疯了。我在底部添加了使用 showhexapagesStepOne 正确编译的新代码
我编辑了这个问题,试图为整个努力提供更多的笛卡尔组织。还更改了提供的代码,使其更接近正确性(我希望)。
我想使用标准书籍文档并更改 fancyhdr 中的页面编号。特别是,我希望页面以十六进制样式 0xABCD 打印。我几乎尝试了所有方法(我不会在这里发布所有代码尝试,因为这会很尴尬),即:
- pythonTex(紧随immediatepython之后):在计数器真正更新到文档之前,尝试传递LaTex计数器时卡住了。两天后我放弃了。
- hex 包(由 Eric Domenjoud 编写,非常老了),但它仍然使用 documentstyle,而我却无法转换旧的 /usename 指令
- 也尝试了 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