如何实现与 titleps 类似的 topmarks

如何实现与 titleps 类似的 topmarks

这是对 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 } }
    }
}

相关内容