我一直在尝试为 sharelatex.com 中的一个项目创建命名法,其中将书籍作为文档类别。命名法无法打印,也没有警告或错误。作为故障排除的一部分,我复制了该项目并摆弄了一会儿,最后才注意到,当我将文档类别更改为文章时,命名法出现了(更改为报告没有任何区别)。然后我将文档类别改回书籍,命名法仍然存在(!)。
之后,我在原始文档中做了同样的事情,但这次没有成功。我的问题是命名函数如何依赖于文档类别?
相关代码:
\documentclass[12pt,twoside]{book}
\usepackage[utf8]{inputenc}
\usepackage{nomencl}
\usepackage{etoolbox}
\makenomenclature
\begin{document}
\renewcommand\nomgroup[1]{%
\item[\bfseries
\ifstrequal{#1}{S}{Symbols}{%
\ifstrequal{#1}{T}{Subscripts}{%
\ifstrequal{#1}{Y}{Abbreviations}{}}}%
]}
\nomenclature[S]{$MW$}{Molecular weight [kg/kmol]}
\nomenclature[T]{$1$}{Inlet}
\nomenclature[Y]{CL}{Control line}
\printnomenclature
\end{document}
答案1
您的示例不会产生任何输出,因为\nomenclature
不会显示任何文本,并且\printnomenclature
如果关联文件(需要通过创建makeindex
)不存在则不会执行任何操作。
ShareLaTeX 失败并中断了整个构建过程,因为 的第一个实例上没有创建 PDF 文件pdflatex
。如果您开始通过添加一些示例文本来修改文档,则构建过程可以完成并且 ShareLaTeX 将运行,makeindex
从而创建 所需的文件\printnomenclature
。
如果您再次修改文档,删除插入的示例文本,所需的文件\printnomenclature
仍然存在,因此可以输入,这意味着可以创建 PDF,因此 ShareLaTeX 的构建过程不会中断。如果您清除所有临时文件(包括所需的文件)\printnomenclature
,则文档将再次变为空文件,构建过程无法完成。
最简单的做法就是在文档中添加一些文本,或者只是\mbox{}
确保 PDF 至少包含一页:
\documentclass[12pt,twoside]{book}
\usepackage[utf8]{inputenc}
\usepackage{nomencl}
\usepackage{etoolbox}
\makenomenclature
\begin{document}
\renewcommand\nomgroup[1]{%
\item[\bfseries
\ifstrequal{#1}{S}{Symbols}{%
\ifstrequal{#1}{T}{Subscripts}{%
\ifstrequal{#1}{Y}{Abbreviations}{}}}%
]}
\nomenclature[S]{$MW$}{Molecular weight [kg/kmol]}
\nomenclature[T]{$1$}{Inlet}
\nomenclature[Y]{CL}{Control line}
\printnomenclature
\mbox{}
\end{document}
ShareLaTeX 的一般信息nomencl
如果您单击“日志和输出文件”按钮(在“重新编译”按钮旁边突出显示),然后单击“其他日志和文件”下拉菜单,您将获得由 LaTeX 和(在本例中)创建的关联文件列表makeindex
。
与该包相关的文件nomencl
有:
nlg
创建的日志文件makeindex
。nlo
\makenomenclature
由 的每个实例创建并写入的文件\nomenclature
。nls
makeindex
由 编写并输入的命名法排版说明\printnomenclature
。在此示例中,文件包含代码:\begin{thenomenclature} \nomgroup{S} \item [{$MW$}]\begingroup Molecular weight [kg/kmol]\nomeqref {0} \nompageref{1} \nomgroup{T} \item [{$1$}]\begingroup Inlet\nomeqref {0}\nompageref{1} \nomgroup{Y} \item [{CL}]\begingroup Control line\nomeqref {0}\nompageref{1} \end{thenomenclature}
如果您更改文档类别,\printnomenclature
仍会尝试输入nls
与之前相同的文件。如果该文件尚未被删除或更改,则仍会输入。环境可能会thenomenclature
因类别不同而略有不同(例如,使用\section*
而不是\chapter*
),这会改变命名法的显示方式,但它仍然是与之前相同的文件。
如果删除该nls
文件,那么命名法将不再出现(因为\printnomenclature
找不到该文件)。
文档构建过程如下(假设主文档文件名为main.tex
):
pdflatex main
makeindex main.nlo -s nomencl.ist -o main.nls
pdflatex main
当您单击 ShareLaTeX 的“重新编译”按钮时,它将执行所有这三个步骤(假设您将编译器设置为pdflatex
)。如果您的命名法未显示,请执行以下检查:
- 检查您是否已
\makenomenclature
在序言中。 \nomenclature
检查文档中是否有一个或多个。\printnomenclature
检查文档中是否有该内容。- 检查
nlg
文件是否有错误makeindex
- 检查
nls
文件是否存在并包含有效的 LaTeX 代码(\begin{thenomenclature}
...\end{thenomenclature}
一个或多个\item
)。
您可以使用“其他日志和文件”下拉列表旁边的“清除缓存文件”按钮删除所有这些辅助文件。这将弹出一个确认框:
删除这些文件后,单击“重新编译”按钮重建文档,然后它们应该全部再次创建。
答案2
看来您的示例可以通过etoolbox
包进行改进。以下代码Nomenclature
在文章、书籍和报告文档类中生成。
\documentclass[12pt,twoside]{book}
\usepackage[utf8]{inputenc}
\usepackage{nomencl}
\makenomenclature
\usepackage{etoolbox}
\renewcommand\nomgroup[1]{%
\item[\bfseries
\ifstrequal{#1}{S}{Symbols}{%
\ifstrequal{#1}{T}{Subscripts}{%
\ifstrequal{#1}{Y}{Abbreviations}{}}}%
]}
\begin{document}
\nomenclature[S]{$MW$}{Molecular weight [kg/kmol]}
\nomenclature[T]{$1$}{Inlet}
\nomenclature[Y]{CL}{Control line}
\printnomenclature
\end{document}