如何使用 OPmac 宏 \kuk 生成不重复页面的目录?

如何使用 OPmac 宏 \kuk 生成不重复页面的目录?

我正在尝试使用 Opmac 在 TeX 中创建幻灯片。但是当我使用宏\kuk和时\maketoc,内容表中会出现重复。

是否有可能只为新章节生成目录中的行?或者读取目录而不产生重复内容...?

我只需要获取章节列表并将其用作幻灯片上的进度条。

例如我有这样的代码:

\input opmac
\chyph

\margins/1 a5l (1,1,1,1.2)cm        % page format
\input ctimes  \typosize[17/22]      % font

\def\pg{\vfil\break}                % new page
\begitems                           % start items

% slideshow with \kuk     
\let\kuk=\relax 
\def\kukdata{}
\long\def\kukstart#1\kuk{\addto\kukdata{#1}%
   \tmpnum=0 \def\endkukdata{}\expandafter\sumkuk \kukdata\sumkuk
   \kukdata\endkukdata \vfil\break \kukstart
}
\long\def\sumkuk#1{\ifx#1\sumkuk
   \loop \ifnum\tmpnum>0 \addto\endkukdata{\enditems}\advance\tmpnum by-1 \repeat
   \else 
     \ifx#1\begitems \global\advance\tmpnum by1 \fi 
     \ifx#1\enditems \global\advance\tmpnum by-1 \fi
     \expandafter\sumkuk \fi
}
\count1=1  
\def\advancepageno{\ifx\kukdata\empty \global\advance\pageno by1 \global\count1=1
                   \else \global\advance\count1 by1 \fi}
\def\pg{\def\kukdata{}\vfil\break}

\kukstart                           % if \kukstart in comment, it prints document normal

\tit Slideshow in \TeX

\pg

\notoc\nonum\sec Table of content

\maketoc

\pg\kuk

\nonum\sec First section

\kuk
* First item
\kuk
* Second item
\kuk
* Third item

\pg\kuk

\nonum\sec Second section

\kuk
* First item 
\kuk
* Second item 
\kuk
* Third item

\enditems
\end
\kuk

这是结果(我一直在使用 pdfcslplain):

结果

但我需要这个:

想要的结果

请仅使用简单的 TeX 解决方案。

谢谢。

答案1

我重新定义将参数与前一个参数进行比较,只有当它们不同时才\sec在文件中写下注释。.ref

当然,如果有两个连续的部分具有相同的标题,则此操作将会失败。

\input opmac
\chyph

\margins/1 a5l (1,1,1,1.2)cm        % page format
\input ctimes  \typosize[17/22]      % font

\def\pg{\vfil\break}                % new page
\begitems                           % start items

% slideshow with \kuk     
\let\kuk=\relax 
\def\kukdata{}
\long\def\kukstart#1\kuk{\addto\kukdata{#1}%
   \tmpnum=0 \def\endkukdata{}\expandafter\sumkuk \kukdata\sumkuk
   \kukdata\endkukdata \vfil\break \kukstart
}
\long\def\sumkuk#1{\ifx#1\sumkuk
   \loop \ifnum\tmpnum>0 \addto\endkukdata{\enditems}\advance\tmpnum by-1 \repeat
   \else 
     \ifx#1\begitems \global\advance\tmpnum by1 \fi 
     \ifx#1\enditems \global\advance\tmpnum by-1 \fi
     \expandafter\sumkuk \fi
}
\count1=1  
\def\advancepageno{\ifx\kukdata\empty \global\advance\pageno by1 \global\count1=1
                   \else \global\advance\count1 by1 \fi}
\def\pg{\def\kukdata{}\vfil\break}

\def\sec#1\par{\ifnonum\else \global\advance\secnum by1 \fi
  \sechook {\globaldefs=1 \seccnum=0 \tnum=0 \fnum=0 \dnum=0}\relax
  \edef\thesecnum{\othe\chapnum.\the\secnum}\let\thetocnum=\thesecnum 
  \def\dotocnumafter{%
    \def\current{#1}%
    \ifx\current\old\else\wcontents\Xsec{#1}\gdef\old{#1}\fi}%
  \printsec{#1\unskip}\resetnonumnotoc
}



\kukstart                           % if \kukstart in comment, it prints document normal

\tit Slideshow in \TeX

\pg

\notoc\nonum\sec Table of content

\maketoc

\pg\kuk

\nonum\sec First section

\kuk
* First item
\kuk
* Second item
\kuk
* Third item

\pg\kuk

\nonum\sec Second section

\kuk
* First item 
\kuk
* Second item 
\kuk
* Third item

\enditems
\end
\kuk

在此处输入图片描述

我离开了Table of content,但要注意它应该是“内容”。

答案2

我会通过创建变量的行为来解决这个问题\sec:您只想在每页第一次使用时写入目录。这可以通过几种方式完成,也许最简单的方法是使用开关。仅显示添加到您的示例中的代码(在第一页之前):

\newif\iffirstslide

\def\sec#1\par{\ifnonum\else \global\advance\secnum by1 \fi
  \sechook {\globaldefs=1 \seccnum=0 \tnum=0 \fnum=0 \dnum=0}\relax
  \edef\thesecnum{\othe\chapnum.\the\secnum}\let\thetocnum=\thesecnum
  \iffirstslide
    \def\dotocnumafter{\wtotoc1\rm{#1}}%
  \else
    \def\dotocnumafter{}%
  \fi
  \firstslidefalse 
  \printsec{#1\unskip}\resetnonumnotoc
}

\def\pg{\def\kukdata{}\firstslidetrue\vfil\break}

根据实际使用情况,您可能需要每个部分级别一个开关、检测每页的第一张幻灯片或类似于封面小节等等。

相关内容