这是对 Javier 就此处工作顶标解决方案的回答的后续问题:如何在页面顶部添加“续”部分标题?
@Javier:您能详细阐述一下如何在 titleps 中实现 topmarks 吗?我使用了 titleps,除了以下两点之外,它确实有效:
例如,我需要 的文字内容,但
\topshortmark\indexthumb
使用\int_from_alph:n { \topshortmark\indexthumb }
却得到了切换机制\@namedef
。如果我直接使用 etex\newmarks
,那么我会得到真实内容,但 是\topmark
错误的。\xspace
此外,在标记内容中使用宏时,\ifsamemark
会出现“未定义的控制序列”错误。
\topmarks
所以我想实现没有切换机制的标题。
更新:
根据哈维尔的提示,我尝试了以下设置,但是,还没有起作用:
\newmarkset{indexmark}
\newcommand{\indexthumb}{}
\newextramark{indexmark}{\indexthumb}
\NewDocumentCommand \indexsection {m} {
\renewcommand{\indexthumb}{#1}
\preextramark{indexmark}
\pagebreak[2]
\hskip 0pt plus 1fil { #1 } \hskip 0pt plus 1fil
\extramark{indexmark}
\fancytab{#1}{\int_from_alph:n {#1}}
\nopagebreak\vskip\onelineskip\par\nopagebreak
}
\AddEverypageHook{
\typeout{INT:~ \topextramarks{indexmark} \int_from_alph:n { \indexthumb } }
}
答案1
好的,我自己做了研究。我的问题的答案非常简单,我想知道我是否没有很好地提出它。我突然想到:如果\firstmark
在 LaTeX 中有效而\topmark
无效,那么只需保留所有标记的列表,将其输入到\firstmark
,然后向后移动一项。或者,这等效于,将每个标记的前身保留在标记本身中,并在使用访问标记时使用它\topmark
。
我现在已经读过了ttlps.def
,这正是它所做的。我无法修复titleps
上面提到的两个问题,所以我只是按照我需要的方式重写并最小化了它:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% extra marks %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ExplSyntaxOn
\cs_generate_variant:Nn \tl_if_eq:nnTF { xxTF }
\def\ifsamemark#1#2{
\let\protect\@unexpandable@protect
\tl_if_eq:xxTF { #1#2 } { \firstshortmark#2 }
{ \expandafter\use_i:nn }
{ \expandafter\use_ii:nn }
}
% ttl@mkc@\a = the (macro)name for the e-tex counter for markset \a
% ttl@mks@\a = contents of a markset \a
% ttl@premks@\a = contents of the previous item of markset \a
% arg: macro, containing the current section etc.
\newcommand\newshortmark[1]{
\newmarkset{\string#1}
\newextramark{\string#1}#1
\extramark{\string#1} % initialize empty mark
}
% arg: macro or name to identify the markset
%
% \newmarkset
% defines the ttl@mkc@#1 counter with \newmarks
% defines \ttl@mks@#1 (to be empty)
% defines ttl@premks@#1 to be \ttl@mks@#1
%
\newcommand\newmarkset[1]{
% define a counter for a new markset called ttl@mkc@#1
\expandafter\newmarks\csname ttl@mkc@#1\endcsname
% \def \ttl@mks@#1 {}
\@namedef{ttl@mks@#1}{}
\@namedef{ttl@premks@#1}{\@nameuse{ttl@mks@#1}}
}
\newcommand\newextramark{\ttl@newmk@i}
% #1: markset name (macro as string: \string\macro)
% #2: \macro
\def\ttl@newmk@i#1#2{
% def \ttl@a to be the macro name (without the \)
\edef\ttl@a{\expandafter\@gobble\string#2}
% call \ttl@newmk@ii {\ttl@a} {#1}
\expandafter\ttl@newmk@ii\expandafter{\ttl@a}{#1}
}
% #1: markset name (macro as string without \)
% #2: macro as string
\def\ttl@newmk@ii#1#2{
\expandafter\def\expandafter\ttl@a\expandafter{\@nameuse{#1}}
\expandafter\let\csname ttl@mks@#2\endcsname\ttl@a
}
% #1: markset name
\newcommand\extramark[1]{%
\begingroup
\let\protect\@unexpandable@protect
% the usual \mark
\marks\csname ttl@mkc@#1\endcsname{
{\@nameuse{ttl@mks@#1}}
{\@nameuse{ttl@mks@#1}}
}
\expandafter\xdef\csname ttl@premks@#1\endcsname {\@nameuse{ttl@mks@#1}}
\endgroup
\if@nobreak\ifvmode\nobreak\fi\fi
}
\newcommand\preextramark[1]{%
\begingroup
\let\protect\@unexpandable@protect
\marks\csname ttl@mkc@#1\endcsname{%
{\csname ttl@mks@#1\endcsname}%
{\csname ttl@premks@#1\endcsname}}%
\endgroup
\if@nobreak\ifvmode\nobreak\fi\fi
}
\newcommand\shortmark[1]{\extramark{\string#1}}
\newcommand\preshortmark[1]{\preextramark{\string#1}}
\newcommand\topshortmark[1]{\topextramarks{\string#1}}
\newcommand\firstshortmark[1]{\firstextramarks{\string#1}}
% #1: the markset name (or macro)
\newcommand\topextramarks[1]{
\expandafter\use_ii:nn\firstmarks\csname ttl@mkc@#1\endcsname
}
\newcommand\firstextramarks[1]{
\expandafter\use_i:nn\firstmarks\csname ttl@mkc@#1\endcsname
}
我想完全用 LaTeX3 来完成(我喜欢它的语法!太简单了!)但还没有时间。代码现在可以这样使用:
\topshortmark\indexitem
\ifsamemark\topshortmark\indexitem{}{(continued)}
如果子项列表或页码列表被拆分到新页面,则会在标题中添加(继续)。我本来想在索引中添加另一个主项,但实际上,该输出例程超出了我的能力范围……
关于字面内容,我现在可以写道:
\AddEverypageHook{
\tl_if_empty:xTF { \topshortmark\indexthumb }
{}
{
\fancytab{ \topshortmark\indexthumb }{ \int_from_alph:n { \topshortmark\indexthumb } }
}
}