在我正在进行的项目中,我使用子文件编译文档,每个子文件包含一个部分。如果我只编译包含某个给定部分的文档,我希望页码是正确的。解决这个问题的一种方法是在编译之前手动设置页码,但我更希望它能自动运行。编译完整文档的主文件包含一个目录,因此有一个包含此信息的 .toc 文件。鉴于这似乎不是子文件包中的内置功能,并且鉴于我不想使用除子文件之外的其他包将我的文档分成几个文件,因此我想编写一个宏,给定一个部分号,返回主文档的 .toc 文件记录的该部分的第一页。
执行此操作的一种方法是,在以某种方式读取此文件的内容后,使用正则表达式在 toc 文件中查找模式 {number}{section.X},给定节号 X。但是,当尝试使用 l3regex 包执行此操作时,我试图理解如何使用 \regex_extract_once 提取节的页码时遇到了困难。下面的代码使用正则表达式 { (\d{1}{2}) .. section.X} 来查找页码,其中 X 是节号,但简单地用 extract 替换 replace 不起作用。
\documentclass{article}
\usepackage{l3regex}
\ExplSyntaxOn
\tl_new:N \l_demo_tl
\seq_new:N \l_demo_res
\cs_new:Npn \demo #1 {
\tl_set:Nn \l_demo_tl {#1}
\regex_replace_once:nnN { (\d{1,2}) .. section\.1} {..............\1...............} \l_demo_tl
\l_demo_tl
}
\ExplSyntaxOff
\begin{document}
\demo{contentsline {section}{numberline {1}Aritmetik och algebra}{3}{section.1}}
\end{document}
那么,有没有更简单的方法来获得这个,或者, \regex_extract_once 如何工作,即如何调整上面的代码来打印匹配的字符串?
答案1
这是我解决这个问题的方法,与 无关l3regex
。我知道它没有回答你所说的问题,但它解决了这个问题。
文件mainfile.tex
\documentclass{article}
\usepackage{subfiles}
\makeatletter
\long\def\@longempty{}
\newcommand{\ifonlysubfile}{%
\ifx\document\@longempty
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
\makeatother
\usepackage{refcount}
\usepackage{currfile}
\usepackage{xr-hyper}
\makeatletter
\@ifundefined{preamble@file}{}{\externaldocument{\preamble@file}}
\makeatother
\usepackage{hyperref}
\textheight=5cm % just to show the page number in a small picture
\begin{document}
\tableofcontents
\clearpage
\subfile{sec1}
\end{document}
文件 sec1.tex
\documentclass[mainfile]{subfiles}
\ifonlysubfile
{}
{\setcounter{page}{\getpagerefnumber{\jobname.tex-page}}}
\begin{document}
\section{This is the first section}
\ifonlysubfile
{\label{\currfilename-page}}
{}
Text
\end{document}
结果
之后pdflatex mainfile
是pdflatex sec1
sec1.pdf