问题如何结合缩略词和词汇表向我们展示了如何制作出色的词汇表和首字母缩略词列表。我想在 Lyx 中使用高质量的词汇表和首字母缩略词列表。
这个问题可能太大了,无法一次性全部问出来。我已经迈出了可能的第一步,结合使用命名法和词汇表。我试图同时使用两个包:
nomenclature
在 Lyx 中呈现词汇表和首字母缩略词列表glossaries
文中第一次使用时使用全名,以后使用缩写。
我的尝试如下所示:
%% LyX 1.6.7 created this file. For more info, see http://www.lyx.org/.
%% Do not edit unless you really know what you are doing.
\documentclass[english]{article}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage{nomencl}
% the following is useful when we have the old nomencl.sty package
\providecommand{\printnomenclature}{\printglossary}
\providecommand{\makenomenclature}{\makeglossary}
\makenomenclature
\makeatletter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands.
\usepackage{hyperref}
\usepackage{glossaries}
\usepackage{nomencl}
\makeglossary
\makenomenclature
\RequirePackage{ifthen}
\renewcommand{\nomgroup}[1]{
\ifthenelse{\equal{#1}{A}}
{\item[\textbf{Acronym}]}
{ \ifthenelse{\equal{#1}{G}}
{\item[\textbf{Glossary}]}{}}
}
\makeatother
\usepackage{babel}
\begin{document}
\newglossaryentry{api}{%
type=\acronymtype,
name={API},
description={Application Programming Interface},
first={Application Programming Interface (API)},
see=[Glossary:]{apig}
}
%%% The glossary entry the acronym links to
\newglossaryentry{apig}{%
name={API}, %
description={An Application Programming Interface (API) is a particular set of rules %
and specifications that a software program can follow to access and make %
use of the services and resources provided by another particular software %
program that implements that API%
}}
\nomenclature[a]{API}{Application Programming Interface}
\nomenclature[g]{API}{%
An Application Programming Interface (API) is a particular set of rules %
and specifications that a software program can follow to access and make %
use of the services and resources provided by another particular software %
program that implements that API%
}
\printnomenclature{}
main text body
first use \gls{api}
subsequent use of \gls{api}
\end{document}
现在我该如何创建一个宏自动使用所有词汇表条目在命名法呈现打印的词汇表。如您所见,现在我正在输入两次。如果您可以删除“命名法”标题并将首字母缩略词和词汇表标题放大,则可以获得加分。如果您能以某种方式使链接正常工作,例如,在首字母缩略词和其对应的词汇表条目之间,则可以获得额外的特殊加分。我将检查提供的解决方案是否在 Lyx 中呈现。
答案1
以下步骤将在 LyX 中生成词汇表和首字母缩略词列表。使用此方法时,LyX 中的“命名法”和“命名法条目”无法使用。
设置
在 LaTeX 序言(“文档 > 设置...”)中,我们添加:
\usepackage[acronym]{glossaries} \makeglossaries
为包生成索引文件
glossaries
使用的选项与为nomencl
包生成的选项不同。需要使用以下包装器脚本。保存在主目录中。对于 Linux,将文件保存
mkgloss.sh
为你的 home 目录,然后通过以下方式使脚本可执行:chmod u+x mkgloss.sh
#!/bin/sh makeglossaries `basename "$1" .glo`
对于 Windows,(警告:未经测试!)将文件保存为
mkgloss.bat
您的主目录REM for loop used for formatting purpose only FOR /F %%I in ("%1") do makeglossaries %%~nI
我们通过更改“工具 > 首选项... > 输出 > LaTeX”中的“命名命令”字段来告诉 LyX 使用此脚本而不是默认脚本
makeindex -s nomencl.ist
。我们使用带有绝对路径的文件名。根据您保存文件的位置,例如,对于 Linux,"/home/tux/mkgloss.sh"
对于 Windows,
"C:\Documents and Settings\Peter\mkgloss.bat"
用法
现在,我们可以使用 TeX 代码/ERT(Ctrl-L)在 LyX 文档中编写首字母缩略词和词汇表条目。例如,
\newglossaryentry{api}{type=\acronymtype, name={API}, description={Application
Programming Interface}, first={Application Programming Interface (API)},
see=[Glossary:]{apig}}
\newglossaryentry{apig}{name={API},
description={An Application Programming Interface (API) is a particular set
of rules and specifications that a software program can follow to access and
make use of the services and resources provided by another particular software
program that implements that API}}
在 LyX 文档中\gls{api}
,TeX 代码/ERT 将使用词汇表条目api
,并将\glsadd{apig}
该条目添加apig
到词汇表中而不生成文本。
最后,我们将两段 TeX 代码写\printglossary[type=\acronymtype]
在\printglossary[type=main]
文档末尾(或缩写列表和词汇表应出现的位置)。现在 PDF 会显示这两者。
可以找到一个工作示例这里(在该网站上将文本保存为“.lyx”文件)。从示例中删除所有分页符后,我们得到:
注意:您可以通过打开 LyX 消息窗格(视图 > 消息窗格)来调试“mkgloss”脚本是否正确执行。如果脚本已执行,您将看到脚本名称出现在消息窗格中的某个位置。
问题:LyX 似乎错过了首字母缩略词条目的更改,因此输出(PDF)中的首字母缩略词列表未更新。
解决方法:在您的 LyX 文档中添加以下 TeX 代码/ERT:
\newglossaryentry{dummy}{name={DUMMY},
description={Type or erase a letter here and LyX will update the glossary and
acronym list (do *not* use space as only working under certain circumstances)}}
\glsadd{dummy}
通过更改此条目的描述,LyX 将收到更新词汇表和首字母缩略词列表的提醒。
答案2
我不知道这与 Lyx 有什么关系,所以我忽略了这一点。其次,了解您想要解决的更大问题可能会有所帮助,因为您链接到的问题似乎实现了相同的目标,只是没有使用nomencl
。仍在开发的软件包可能glossaries
适合解决手头的更大问题。
话虽如此,我们开始吧。
为了使组标题更大,我们
\Large
在已经将其加粗的位置插入:\renewcommand{\nomgroup}[1]{% \ifthenelse{\equal{#1}{A}}% {\item[\textbf{\Large Acronym}]}% { \ifthenelse{\equal{#1}{G}}% {\item[\textbf{\Large Glossary}]}% {}% }% }
为了摆脱“命名法”,我们
\thenomenclature
使用以下etoolbox
包进行修补:\patchcmd{\thenomenclature}{% \section*{\nomname} \if@intoc\addcontentsline{toc}{section}{\nomname}\fi% }{}{}{\message{^^JPatching of thenomenclature failed^^J}}
请注意,这还会从目录中删除“命名法”条目,因为我们不再有分段命令。如果您使用的是章节文档(如)
book
,则section
需要将上面的 s 替换为chapter
。为了减少重新输入
\thenomenclature
条目,我们修补了在第一次为条目调用时执行所有工作的宏。我们添加了两个\@gls@
调用:\gls{api}
\gls*{api}
\nomenclature
\patchcmd{\@gls@}{% \glsunset{#2}% }{% \ifglsused{#2}{}{% \nomenclature[a]{\glsentryname{#2}}{\glsentrydesc{#2}}% \nomenclature[g]{\glsentryname{#2g}}{\glsentrydesc{#2g}}% }% \glsunset{#2}% }{}{\message{^^JPatching of gls failed^^J}}
为了正确实现超链接,术语表中的词汇表条目必须成为超目标,而术语表中的首字母缩略词条目应该获得指向此目标的链接。该目标将通过使用
\nomenclature[g]{\hypertarget{glo:#2}{\glsentryname{#2g}}}{\glsentrydesc{#2g}}%
在上面的代码中。
在首字母缩略词条目中创建链接比较困难:有人可能会想把它直接放在
\nomenclature
call 的第二个参数中,但这会被吃掉makeindex
。相反,我们将该链接的标签和文本保存到两个变量中:\nomenclature[a]{\hyperlink{glo:#2}{\glsentryname{#2}}}{ \glsentrydesc{#2}\def\glolinklabel{glo:#2}\def\glolinktext{\glsentryname{#2}}}%
之后可以使用。为了在词汇表描述和页面引用之间建立链接,我们使用
\pretocmd{\nompageref}{% \ifx\glolinklabel\@empty% \relax% \else% , \textit{Glossary:} \hyperlink{\glolinklabel}{\glolinktext}% \fi% }{}{\message{^^JAppending to nompageref failed^^J}}
为了将链接放在可能的页面引用之后,我们使用
\renewcommand{\nomentryend}{% \ifx\glolinklabel\@empty% \relax% \else% ; \textit{Glossary:} \hyperlink{\glolinklabel}{\glolinktext}% \fi% }
结果:
完成 MWE:
\documentclass[english]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
%% the following is useful when we have the old nomencl.sty package
% \usepackage{nomencl}
% \providecommand{\printnomenclature}{\printglossary}
% \providecommand{\makenomenclature}{\makeglossary}
% \makenomenclature
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands.
\usepackage{kantlipsum}
\usepackage{babel}
\usepackage{ifthen}
\usepackage[debug,colorlinks]{hyperref}
\usepackage[refpage]{nomencl}
% \usepackage{nomencl}
\usepackage{glossaries}
\usepackage{etoolbox}
\makenomenclature
\makeatletter
%% Write name and description to the glossary of the nomenclature.
%% This assumes that only the acronyms are referenced in the text, i.e.,
%% you only use \gls{api}, not \gls{apig}.
%% The glossaries package makes hyperlinks from \gls{<label>} as glo:<label>, so we make
%% corresponding hypertargets at the nomencl--glossary entry.
%% Define the storage here, otherwise hyperref complains.
\def\glolinklabel{}
\def\glolinktext{}
\patchcmd{\@gls@}{%
\glsunset{#2}%
}{%
ifglsused{#2}{}{%
%% acronym entry:
% \nomenclature[a]{\glsentryname{#2}}{
% \glsentrydesc{#2}\def\glolinklabel{glo:#2}\def\glolinktext{\glsentryname{#2}}}%
%% or with another link at the acronym
\nomenclature[a]{\hyperlink{glo:#2}{\glsentryname{#2}}}{
\glsentrydesc{#2}\def\glolinklabel{glo:#2}\def\glolinktext{\glsentryname{#2}}}%
%% does not work:
% \nomenclature[a]{\hyperlink{glo:#2}{\glsentryname{#2}}}{
% \glsentrydesc{#2}\def\glolinklabel{glo:#2}\def\glolinktext{\glsentryname{#2}}; \textit{Glossary: }
% \hyperlink{glo:#2}{\glsentryname{#2}}}%
%% glossary entry:
\nomenclature[g]{\hypertarget{glo:#2}{\glsentryname{#2g}}}{\glsentrydesc{#2g}}%
}%
\glsunset{#2}%
}{}{\message{^^JPatching of gls failed^^J}}
%% At the end of acronym entries (those that define \glolinklabel and \glolinktext), put
%% a link to the corresponding glossary entry after possible page references.
% \renewcommand{\nomentryend}{%
% \ifx\glolinklabel\@empty%
% \relax%
% \else%
% ; \textit{Glossary:} \hyperlink{\glolinklabel}{\glolinktext}%
% \fi%
% }
%% At the end of acronym entries (those that define \glolinklabel and \glolinktext), put
%% a link to the corresponding glossary entry before possible page references.
\pretocmd{\nompageref}{%
\ifx\glolinklabel\@empty%
\relax%
\else%
, \textit{Glossary:} \hyperlink{\glolinklabel}{\glolinktext}%
\fi%
}{}{\message{^^JAppending to nompageref failed^^J}}
\makeatother
%% To get rid of the Nomenclature section title, but this still adds a \section*{}
% \renewcommand{\nomname}{}
%% So remove the section, too. But then we should not write to the ToC, either.
\makeatletter
\patchcmd{\thenomenclature}{%
\section*{\nomname}
\if@intoc\addcontentsline{toc}{section}{\nomname}\fi%
}{}{}{\message{^^JPatching of thenomenclature failed^^J}}
\makeatother
%% Large bold group headings.
\renewcommand{\nomgroup}[1]{%
\ifthenelse{\equal{#1}{A}}%
{\item[\textbf{\Large Acronym}]}%
{ \ifthenelse{\equal{#1}{G}}%
{\item[\textbf{\Large Glossary}]}%
{}%
}%
}
%% glossary entries
\newglossaryentry{api}{%
type=\acronymtype,%
name={API},%
description={Application Programming Interface},%
first={Application Programming Interface (API)},%
% see=[Glossary:]{apig}%
}
%% The glossary entry the acronym links to
\newglossaryentry{apig}{%
name={API},%
description={An Application Programming Interface (API) is a particular set of rules %
and specifications that a software program can follow to access and make %
use of the services and resources provided by another particular software %
program that implements that API%
}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\printnomenclature
main text body
first use \gls{api}
\kant[1]
subsequent use of \gls{api}
\kant[2-3]
another use of \gls*{api}
\kant[4-5]
another use of \gls{api}
\end{document}
定义一个glossaries
条目可能更简洁,以防止意外使用词汇表条目apig
。它还使代码更健壮,因为我们不依赖于命名方案api
-> apig
。这可以通过使用字段进行长描述来实现user1
。唯一需要更改的是词汇表条目生成:
\nomenclature[g]{\hypertarget{glo:#2}{\glsentryname{#2g}}}{\glsentryuseri{#2}}%
(注意 的用法\glsentryuseri
。)单个条目看起来如下:
\newglossaryentry{api}{%
type=\acronymtype,%
name={API},%
description={Application Programming Interface},%
first={Application Programming Interface (API)},%
user1={An Application Programming Interface (API) is a particular set of rules %
and specifications that a software program can follow to access and make %
use of the services and resources provided by another particular software %
program that implements that API},%
% see=[Glossary:]{apig}%
}
答案3
整合词汇表包装莱克斯
方法 1
glossaries
只需使用该选项加载包即可automake
。通过将以下内容添加到 LyX 中的 LaTeX 前言中(可在 中找到Document > Settings > LaTeX Preamble
)即可实现此目的:
% Initialize the glossaries package
\usepackage[automake]{glossaries}
\makeglossaries
% Define all your glossary entries
\newglossaryentry{...}
\newglossaryentry{...}
方法 2
该automake
选项从 4.08 版开始可用。如果您仍使用旧版本,则可以将以下内容添加到序言中:
% Initialize the glossaries package
% Note the use of savewrites. This option allows us to use \glswritefiles later on
\usepackage[savewrites]{glossaries}
\makeglossaries
% Define all your glossary entries
\newglossaryentry{...}
\newglossaryentry{...}
...
% At the end of the document (after the .aux file has been written)
\AtVeryEndDocument{
% Write the .glo file
\glswritefiles
% Call makeglossaries
\immediate\write18{makeglossaries \jobname}
% Avoid rewritting the .glo file later on.
\let\glswritefiles\relax
}
两种方法均相同
无论使用哪种方法,您都无需手动重新运行 LaTeX 处理器。LyX 会自动执行此操作。即使您将词汇表添加到目录中也是如此(否则需要运行 3 次 LaTeX)!
请注意,您的 LaTeX 处理器必须启用 shell 执行。通过在 LaTeX 命令中添加--enable-write18
或--shell-escape
来执行此操作。请参阅下面的指南了解更多详细信息。
启用shell 执行在莱克斯
方法 1
我们以此pdflatex
为例。
- 去
Tools > Preferences > File Handling > Converters
。 - 选择
LaTeX (pdflatex) -> PDF (pdflatex)
。 Converter
将字符串从修改pdflatex $$i
为pdflatex --enable-write18 $$i
。
方法 2
方法 1 是显而易见的方法。但是,出于某种原因,LyX 有时无法识别更改。我遇到过这种情况(LyX 2.1.2)。如果您遇到这种情况,请编辑该lyxrc.defaults
文件。它位于C:\Users\%username%\AppData\Roaming\LyX2.1
Windows 上。将行
\converter pdflatex pdf2 "pdflatex $$i" "latex=pdflatex"
到
\converter pdflatex pdf2 "pdflatex --enable-write18 $$i" "latex=pdflatex"
然后重新启动 LyX。
答案4
诀窍是尽可能多地利用 LyX 的内置nomencl
支持。我通过借鉴LyX 维基条目中的 Biblatex。
首先,我们在 LyX 中创建一个带有命名法的文档。
Insert > List / TOC > Nomenclature
由于我们不希望 LyX 打印命名法,因此在 LyX 注释(黄色框)中“捕获”该元素。
接下来我们编辑文档序言。
Document > Settings > LaTeX Preamble
添加以下部分:
% call the glossaries package
\usepackage{glossaries}
% activate the glossaries building
\makeglossaries
% redefine the command that LyX puts out, to the glossaries input
\let\nomenclature\gls
% add your glossaries entries
\newglossaryentry{linux}{name={linux},description={an open-source unix implementation}}
保存文档设置。
现在,像在 LyX 中通常做的那样添加命名法条目(除了您不添加您正在定义的工作,因为词汇表会为您输入它)。添加(命名法)条目时,请不要给出描述(输入一个空格,以便您可以关闭窗口),否则它也会出现在您的文档中。如果您查看代码(查看 > 源代码),它应该看起来像这样:
\nomenclature{linux}{ }
现在编译文档。词汇表不会出现,文档中的条目也不会出现。为此,您首先需要makeglossaries filename
在 LyX 临时文件夹中运行。如果您使用的是 Linux,则此文件夹位于
/tmp/SomeLyxTempFolder
如果你使用的是 Windows,则类似
Users > username > Appdata > Local > Temp > someLyxTempFolder
请注意,必须有更好的方法将 LyX nomencl 输出重用为词汇表输入,例如使用\renewcommand
或其他方法(尤其是仅使用第一个参数\nomenclature
),但我无法弄清楚。