我正在尝试使用 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}
根据实际使用情况,您可能需要每个部分级别一个开关、检测每页的第一张幻灯片或类似于封面小节等等。