如何在两个文档中获得相同的短章节名称和长章节名称?

如何在两个文档中获得相同的短章节名称和长章节名称?

背景

我曾经memoir排版过一本教科书和一本解答手册。对于教科书中有问题的章节,解答手册中都有相应的章节。不用说,我希望对应章节的章节编号和标题一致,但我不想输入两次。

分子武器

以下 MWE 说明了我现在正在做的事情——它几乎满足了我想要的所有要求。第一个(教科书)文件名为doc1.tex

\documentclass{memoir}
\begin{document}
\tableofcontents
\chapter{A Chapter}
\chapter{Another Chapter}
\label{doc1:another_chapter}
\chapter{Yet Another Chapter}
\chapter[Final Chapter Short]{Final Chapter\\Long} % note short and long titles
\label{doc1:final_chapter}
\end{document}

第二个(解决方案手册文件)是:

\documentclass{memoir}
\usepackage{refcount}
\newcounter{newcounter}
\usepackage{xr}
\externaldocument{doc1}
\begin{document}
\tableofcontents
\setcounterref{newcounter}{doc1:another_chapter}
\setcounter{chapter}{\thenewcounter}
\addtocounter{chapter}{-1}
\chapter{Another Chapter}
\setcounterref{newcounter}{doc1:final_chapter}
\setcounter{chapter}{\thenewcounter}
\addtocounter{chapter}{-1}
\chapter{\titleref{doc1:final_chapter}}
\end{document}

因此,在解决方案手册中我有两章;第一章是“第 2 章”,第二章是“第 4 章”。

问题

问题在于,该titleref命令为我提供了解决方案手册第二章(第 4 章)的短章节标题(用于目录),而我想要长标题。

根据我在memoirv3.7b 手册中读到的内容(特别是第 297 页的底部),这似乎是预期的行为,并且似乎没有办法将长名称作为章节名称。

问题

我如何修改上面的 MWE 以便memoir在文档本身中提供长名称并在目录中提供短名称?(一个粗略的后备解决方案是将所有内容放入\chapter[short title]{long title}单独的.tex文件中,然后\input在两个文档中都使用它们。)

答案1

当文档被编译时,它会创建一个名为的文件chapterlist,其中定义了一系列宏。

\documentclass{memoir}
\usepackage{etoolbox}% provides \expandonce

\newwrite\myfile
\AtBeginDocument{\openout\myfile=chapterlist}
\AtEndDocument{\closeout\myfile}% not really necessary

\newcommand{\mychapter}[2][\empty]% #1 = short title (optional), #2 = long title
{\bgroup
  \def\foo{#2}% local definition
  \ifx\empty#1\relax
    \chapter{#2}
    \immediate\write\myfile{\string\newcommand{\string\mychapter\Roman{chapter}}}
    \addtocounter{chapter}{-1}%
    \immediate\write\myfile{\string{\string\setcounter{chapter}{\thechapter}\string\chapter{\expandonce\foo}\string}}%
  \else
    \chapter[#1]{#2}
    \immediate\write\myfile{\string\newcommand{\string\mychapter\Roman{chapter}}}
    \addtocounter{chapter}{-1}%
    \immediate\write\myfile{\string{\string\setcounter{chapter}{\thechapter}\string\chapter[#1]{\expandonce\foo}\string}}%
  \fi
  \stepcounter{chapter}%
\egroup}

\begin{document}
\tableofcontents
\mychapter{A Chapter}
\mychapter{Another Chapter}
\label{doc1:another_chapter}
\mychapter{Yet Another Chapter}
\mychapter[Final Chapter Short]{Final Chapter\\Long}
\label{doc1:final_chapter}
\end{document}

然后将此文件输入到解决方案版本中以重新创建章节。

\documentclass{memoir}
\input{chapterlist}
\begin{document}
\tableofcontents
\mychapterII
\mychapterIV
\end{document}

答案2

使用答案包,可以得到一站式解决方案。以下是示例

\documentclass{memoir}

\usepackage{answers}
\Opensolutionfile{sm}[SolutionManual]%  %write to file SolutionManual.tex

\Writetofile{sm}{%                      %SolutionManual.tex preambl
\string\documentclass{memoir}^^J%
\string\begin{document}^^J%
\string\tableofcontents}

\AtEndDocument{%
\Writetofile{sm}{%                     %SolutionManual.tex bye
\string\end{document}}}

\makeatletter
\newcommand{\smadd}[1]{%
\immediate\write\sm@file{%
\string\setcounter{chapter}{\thechapter}}
\immediate\write\sm@file{%
\unexpanded{#1}}%
#1}
\makeatother

\begin{document}
\tableofcontents

\smadd{\chapter[Foo bar]{Very long foo}}
Bla bla of the chapter

\begin{Filesave}{sm}
Solution manual Contents
\end{Filesave}

\chapter{Bar}
\chapter{Baz}

\smadd{\chapter[Baz baz]{Very very long baz}}
Bla bla of the chapter

\begin{Filesave}{sm}
Solution manual Contents
\end{Filesave}

\end{document}

这将创建一个可立即使用的SolutionManual.tex

相关内容