核心功能是标记在页眉处出现的项。
\protected\def\markcontext#1#2{%
\begingroup
\let\label\relax \let\index\relax \let\glossary\relax
\unrestored@protected@xdef\@themark {#2}%
\@temptokena \expandafter{\@themark}%
\marks#1{\the\@temptokena}%
\endgroup
\if@nobreak\ifvmode\nobreak\fi\fi}
\ExplSyntaxOn
\cs_new:Npn \@removetl #1#2 { \tl_range:Nnn #1 { \tl_count:o {#2} + 1 }{ -1 } }
\ExplSyntaxOff
\def\@headtext{}
\newmarks\@headmark
\newmarks\@pinyinmark
\providecommand\lettrine[3][]{\textbf{#2}#3}
\protected\def\dictitem#1#2{\lettrine{#1}{[#2]}\g@addto@macro\@headtext{{#1}}%
\markcontext\@headmark{\@headtext}%
\markcontext\@pinyinmark{#2}}
\def\@headoddleft{\thepage\quad
\botmarks\@headmark\quad
\firstmarks\@pinyinmark --\botmarks\@pinyinmark
\xdef\@headtext{\@removetl\@headtext{\botmarks\@headmark}}}
\def\@headevenright{\botmarks\@headmark\quad
\firstmarks\@pinyinmark --\botmarks\@pinyinmark
\quad\thepage
\xdef\@headtext{\@removetl\@headtext{\botmarks\@headmark}}}
这一部分无需加载任何宏包。
这里定义了一个 \@removetl
,目的是当存储的页眉项与真正出现在页眉中的项不同时,需要保存未真正出现在页眉中的项,否则下一页页眉将损失这些项。
之所以会出现存储的页眉项与真正出现在页眉中的项不同的情况,是因为 TeX 在 shipout 之前就已经执行了存储功能的那部分宏,此时 TeX 还未决定哪些内容输出至当前页。
至于使用 titleps
还是 fancyhdr
是无关紧要的。
\documentclass[twoside]{article}
\makeatletter
\protected\def\markcontext#1#2{%
\begingroup
\let\label\relax \let\index\relax \let\glossary\relax
\unrestored@protected@xdef\@themark {#2}%
\@temptokena \expandafter{\@themark}%
\marks#1{\the\@temptokena}%
\endgroup
\if@nobreak\ifvmode\nobreak\fi\fi}
\ExplSyntaxOn
\cs_new:Npn \@removetl #1#2 { \tl_range:Nnn #1 { \tl_count:o {#2} + 1 }{ -1 } }
\ExplSyntaxOff
\def\@headtext{}
\newmarks\@headmark
\newmarks\@pinyinmark
\providecommand\lettrine[3][]{\textbf{#2}#3}
\protected\def\dictitem#1#2{\lettrine{#1}{[#2]}\g@addto@macro\@headtext{{#1}}%
\markcontext\@headmark{\@headtext}%
\markcontext\@pinyinmark{#2}}
\def\@headoddleft{\thepage\quad
\botmarks\@headmark\quad
\firstmarks\@pinyinmark --\botmarks\@pinyinmark
\xdef\@headtext{\@removetl\@headtext{\botmarks\@headmark}}}
\def\@headevenright{\botmarks\@headmark\quad
\firstmarks\@pinyinmark --\botmarks\@pinyinmark
\quad\thepage
\xdef\@headtext{\@removetl\@headtext{\botmarks\@headmark}}}
\usepackage{ctex}
\usepackage{xpinyin}
\usepackage[a5paper,includeheadfoot,margin=1cm,headsep=10pt]{geometry}
\usepackage{lettrine}
\usepackage{zhlipsum}
%% titleps
\usepackage{titleps}
\newpagestyle{dict}{
\setheadrule{0.4pt}
\sethead[][][\@headevenright]{\@headoddleft}{}{}
\setfoot{}{}{}}
%% fancyhdr
%\usepackage{fancyhdr}
%\fancypagestyle{dict}{
% \def\headrulewidth{0.4pt}
% \fancyfoot{}
% \fancyhead[OL]{\@headoddleft}
% \fancyhead[ER]{\@headevenright}}
\makeatother
\pagestyle{dict}
\begin{document}
\dictitem{哥}{\pinyin{ge1}}\zhlipsum[3][name=zhufu]
\dictitem{歌}{\pinyin{ge1}}\zhlipsum[6][name=zhufu]
\dictitem{割}{\pinyin{ge1}}\zhlipsum[8][name=zhufu]
\dictitem{革}{\pinyin{ge2}}\zhlipsum[9][name=zhufu]
\dictitem{愅}{\pinyin{ge2}}\zhlipsum[12][name=zhufu]
\dictitem{鞈}{\pinyin{ge2}}\zhlipsum[14][name=zhufu]
\dictitem{閤}{\pinyin{ge2}}\zhlipsum[14][name=zhufu]
\dictitem{蛤}{\pinyin{ge2}}\zhlipsum[15][name=zhufu]
\dictitem{韐}{\pinyin{ge2}}\zhlipsum[16][name=zhufu]
\dictitem{阁}{\pinyin{ge2}}\zhlipsum[8][name=zhufu]
\dictitem{格}{\pinyin{ge2}}\zhlipsum[10][name=zhufu]
\end{document}
万分感谢大佬!
对于字典,是不是可以使用数据库或csv文件进行处理,当然这与这个问题本身无关。
@u78 可以,只要设置好格式,基本上可以自动生成了。
这是字典,处理起来要容易和直接一点。如果是汉语词典,面临的情况会比较复杂。
汉语词典除了字条,还有词条。页眉的范围要考虑这两者。而对于词条,有两个难点。
一是,对词条的词语进行分割,只保留第一个字上页眉(这个容易);对词条的拼音进行分割,只保留第一个子的读音上页眉(这个困难)。
二是,对重复的上页眉内容进行合并。