背景
我曾经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 章)的短章节标题(用于目录),而我想要长标题。
根据我在memoir
v3.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