因此我有这个宏可以与包一起使用glossaries
:
\usepackage{xparse}
\DeclareDocumentCommand{\newdualentry}{ O{} O{} m m m m } {
\newglossaryentry{gls-#3}{name={#5 (#4)},description={#6},#1}
\newglossaryentry{#3}{type=\acronymtype, name={#4}, description=#5, first={\gls{gls-#3}}, see=[Glossar:]{gls-#3}}
}
这使我可以定义如下双重条目:
\newdualentry{CAE} % label
{CAE} % abbreviation
{Computer Aided Engineering} % long form
{Zu Deutsch rechnergestützte Entwicklung. In der Automobilbranche häufig als Dachbegriff für alle Berechnungsaufgaben, wie FEM-Berechnungen oder Strömungsberechnungen gesehen} % description
但现在的问题是:当我没有在文档中引用此条目并且
\printacronyms
尽管如此,所有条目仍将显示。
我怎样才能阻止这种情况发生?
我尝试将\glsunset{#3}
和添加\glsunset{gls-#3}
到\newdualentry
命令中,但没有成功。
编辑:添加可编译的示例
% !TEX encoding = UTF-8
% !TEX spellcheck = de_DE
\documentclass[11pt,a4paper,numbers=enddot,bibliography=totoc,toc=sectionentrywithdots,dvipsnames]{scrartcl}
\usepackage[utf8]{inputenc} % Formatting
\usepackage[T1]{fontenc} %Europäische fontcodierung
\usepackage[ngerman]{babel} % Deutsch
\usepackage{textcomp} % Euro Zeichen usw für T1 font
\usepackage{lmodern} %Clear PDF Fonts
\usepackage[
%hidelinks,
pdfborder={0 0 0},
bookmarks,
linktoc=all,
bookmarksopen=true,
colorlinks=false,
linkcolor=blue, % einfache interne Verkn¸pfungen
anchorcolor=black, % Ankertext
citecolor=red, % Verweise auf Literaturverzeichniseintr‰ge im Text
filecolor=black, % Verkn¸pfungen, die lokale Dateien ˆffnen
menucolor=black, % Acrobat-Men¸punkte
urlcolor=blue,
pagebackref=false,
plainpages=false, % zur korrekten Erstellung der Bookmarks
pdfpagelabels, % zur korrekten Erstellung der Bookmarks
%hypertexnames=false, % zur korrekten Erstellung der Bookmarks
]{hyperref}
%------------------------ Glossaries ----------------------
\usepackage[acronyms,translate=babel,xindy,style=list]{glossaries}
\usepackage{xparse}
\DeclareDocumentCommand{\newdualentry}{ O{} O{} m m m m } {
\glsunsetall
\newglossaryentry{gls-#3}{name={#5 (#4)},description={#6},#1}
\newglossaryentry{#3}{type=\acronymtype, name={#4}, description=#5, first={\gls{gls-#3}}, see=[Glossar:]{gls-#3}}
}
%----------------------- First Gls Entry Format --------------------------
% First GLs with Footnote
\defglsentryfmt{%
\glsifplural{
\ifglsused{\glslabel}{%
\unskip\textit{\glsentryplural{\glslabel}}\ignorespaces%
}{%
% Typeset first use
\unskip\textit{\glsentryplural{\glslabel}}\footnote{\Glsentrydesc{\glslabel}.}\ignorespaces%
}%
}{
\ifglsused{\glslabel}{%
\unskip\textit{\glsgenentryfmt}\ignorespaces%
}{%
% Typeset first use
\unskip\textit{\glsentryname{\glslabel}}\footnote{\Glsentrydesc{\glslabel}.}\ignorespaces%
}%
}
}
%---------------------------------------------------------------------------
\makeglossaries
%----------------------- GLS Definitions --------------------------
\newdualentry{FEM} % label
{FEM} % abbreviation
{Finite Elemente Methode} % long form
{Numerisches Berechnungsverfahren, um Spannungen und Kräfte in und zwischen Bauteilen zu ermitteln} % description
\newdualentry{CAD} % label
{CAD} % abbreviation
{Computer Aided Design} % long form
{Zu Deutsch rechnerunterstütztes Konstruieren. Das computergestützte erstellen von 3D-Modellen} % description
\newacronym{PKW}{PKW}{Personenkraftwagen}
%------------------------------------------------------------------
\begin{document}
\printacronyms
\printglossary
\newpage
\section{Tester}
TestTest \gls{CAD}
\end{document}
请注意,词汇表列表是正确的,但首字母缩略词列表不正确。
答案1
我个人认为,在表格中输入内容看起来有点多余
CAD 计算机辅助设计。2、词汇表:计算机辅助设计(CAD)
重复看起来很别扭,为什么让读者在一个列表中查找参考资料,却又被重定向到另一个列表?但是,我知道这是常见的做法(glossaries
用户手册中也有类似的例子),所以这里对这个问题以及如何规避它进行了解释。
我尝试将
\glsunset{#3}
和添加\glsunset{gls-#3}
到\newdualentry
命令中,但没有成功。
首次使用标记并不控制条目是否出现在词汇表中,因此\glsunset
不会对其产生影响。索引功能会将条目添加到索引中。
see
定义键时,键会自动索引条目。此行为是手册中记录:
使用
see
密钥将自动将此条目添加到词汇表中但不会自动添加交叉引用的条目。应将引用的条目作为此键的值提供。
这可以用一个更简单的 MWE 来说明,但这与您遇到的基本问题相同:
\documentclass{article}
\usepackage{glossaries}
\makeglossaries
\newglossaryentry{foo}{name={foo},description={foo description}}
\newglossaryentry{bar}{name={bar},description={bar description},see={foo}}
\begin{document}
\gls{foo}.
\printglossaries
\end{document}
尽管bar
文档中没有引用,但它由于关键字而出现在词汇表中see
。
如果您想使用see
文档中可能未引用的条目的密钥,则主要有三种方法。
方法 1:不使用see
密钥
see
不要使用密钥,而是添加\glssee
到描述中:
\documentclass{article}
\usepackage{glossaries}
\makeglossaries
\newglossaryentry{foo}{name={foo},description={foo description}}
\newglossaryentry{bar}{name={bar},description={bar description\glssee{bar}{foo}}}
\begin{document}
\gls{foo}, \gls{bar}.
\printglossaries
\end{document}
在创建词汇表之前不会进行交叉引用,因此,如果调用该文档,myDoc.tex
则构建过程如下:
pdflatex myDoc
makeglossaries myDoc
pdflatex myDoc
makeglossaries myDoc
pdflatex myDoc
(根据需要替换pdflatex
为“etc”。)xelatex
普通的留言
- 正如 Christian 在评论中提到的那样,使用
\gls
内部字段会导致嵌套链接,这是有问题的。 您的代码中存在由行尾字符引起的虚假空格,您已使用
\unskip
和进行了补偿\ignorespaces
。只需注释掉虚假空格即可:\defglsentryfmt{% \glsifplural{% <---- added \ifglsused{\glslabel}{% \textit{\glsentryplural{\glslabel}}% }{% % Typeset first use \textit{\glsentryplural{\glslabel}}\footnote{\Glsentrydesc{\glslabel}.}% }% }{% <---- added \ifglsused{\glslabel}{% \textit{\glsgenentryfmt}% }{% % Typeset first use \textit{\glsentryname{\glslabel}}\footnote{\Glsentrydesc{\glslabel}.}% }% }% <---- added }
您的输入格式代码也不会检查大小写变化或自定义文本,因此如果您使用
\glsdisp
或\glslink
或\GLS
等,您将得到意外的结果。
方法 2:禁用自动索引
如果在打开相关词汇表文件之前(即之前\makeglossaries
)定义条目,则此时无法进行索引。由于这种情况可能会意外发生,因此glossaries
包默认会引发错误。因此修改上述内容:
\documentclass{article}
\usepackage{glossaries}
\newglossaryentry{foo}{name={foo},description={foo description}}
\newglossaryentry{bar}{name={bar},description={bar description},see={foo}}
\makeglossaries
\begin{document}
\gls{foo}.
\printglossaries
\end{document}
这会导致出现错误信息:
! Package glossaries Error: `see' key may only be used after \makeglossaries or
\makenoidxglossaries (or move \newglossaryentry definitions into the preamble)
(这就是为什么如评论中提到的,一般建议将其放在\makeglossaries
前面的原因。)\newglossaryentry
\newacronym
您可以使用以下方法避免出现此错误信息seenoindex=ignore
:
\documentclass{article}
\usepackage[seenoindex=ignore]{glossaries}
\newglossaryentry{foo}{name={foo},description={foo description}}
\newglossaryentry{bar}{name={bar},description={bar description},see={foo}}
\makeglossaries
\begin{document}
\gls{foo}.
\printglossaries
\end{document}
现在仅foo
出现在词汇表中,因为see
键入bar
会默默失败。但是,如果您稍后索引bar
,则不会获得交叉引用:
\documentclass{article}
\usepackage[seenoindex=ignore]{glossaries}
\newglossaryentry{foo}{name={foo},description={foo description}}
\newglossaryentry{bar}{name={bar},description={bar description},see={foo}}
\makeglossaries
\begin{document}
\gls{foo}, \gls{bar}.
\printglossaries
\end{document}
基础glossaries
包不存储键的值see
,但扩展包glossaries-extra
确实如此,并且它还有一个选项可以阻止自动索引(autoseeindex=false
)。然后,您可以遍历文档末尾所有使用的条目,并检查字段是否存在see
:
\documentclass{article}
\usepackage[autoseeindex=false]{glossaries-extra}
\makeglossaries
\newglossaryentry{foo}{name={foo},description={foo description}}
\newglossaryentry{bar}{name={bar},description={bar description},see={foo}}
\newcommand{\seeref}[1][\seename]{\def\dosee{\glssee[#1]}\xseeref}
\def\xseeref#1|#2|{\dosee{#2}{#1}}
\AtEndDocument
{%
\forallglossaries{\thistype}%
{%
\forglsentries[\thistype]{\thislabel}%
{%
\ifglsused{\thislabel}%
{%
\ifglshasfield{see}{\thislabel}%
{\expandafter\seeref\glscurrentfieldvalue|\thislabel|}{}%
}%
{}%
}%
}
}
\begin{document}
\gls{foo}, \gls{bar}.
\printglossaries
\end{document}
文档构建比第一种方法更简单:
pdflatex myDoc
makeglossaries myDoc
pdflatex myDoc
注意,glossaries-extra
你需要使用 设置缩写样式\setabbreviationstyle
。例如:
\setabbreviationstyle[acronym]{long-short}
\newacronym{PKW}{PKW}{Personenkraftwagen}
或者
\setabbreviationstyle{long-short}
\newabbreviation{PKW}{PKW}{Personenkraftwagen}
返回您的 MWE:
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{xparse}
\usepackage[colorlinks]{hyperref}
\usepackage[acronym,autoseeindex=false]{glossaries-extra}
\makeglossaries
\DeclareDocumentCommand{\newdualentry}{ O{} O{} m m m m }{%
\newglossaryentry{gls-#3}{name={#5 (#4)},description={#6},#1}%
\newacronym[see={gls-#3},#2]{#3}{#4}{#5}%
}
\apptoglossarypreamble[acronym]{\renewcommand{\seename}{Glossar:}}
\setabbreviationstyle[acronym]{long-short}
\renewcommand{\glsfirstlongdefaultfont}[1]{\emph{#1}}
\renewcommand{\glsfirstabbrvdefaultfont}[1]{\emph{#1}}
\newcommand{\glsxtrpostlinkacronym}{%
\ifglsentryexists{gls-\glslabel}%
{%
\glsadd{gls-\glslabel}%
\glsxtrifwasfirstuse
{%
\footnote{\Glsentrydesc{gls-\glslabel}}%
}%
{}%
}%
{}%
}
\newdualentry{FEM} % label
{FEM} % abbreviation
{Finite Elemente Methode} % long form
{Numerisches Berechnungsverfahren, um Spannungen und Kräfte in und
zwischen Bauteilen zu ermitteln} % description
\newdualentry{CAD} % label
{CAD} % abbreviation
{Computer Aided Design} % long form
{Zu Deutsch rechnerunterstütztes Konstruieren. Das computergestützte
erstellen von 3D-Modellen} % description
\newacronym{PKW}{PKW}{Personenkraftwagen}
\newcommand{\seeref}[1][\seename]{\def\dosee{\glssee[#1]}\xseeref}
\def\xseeref#1|#2|{\dosee{#2}{#1}}
\AtEndDocument
{%
\forallglossaries{\thistype}%
{%
\forglsentries[\thistype]{\thislabel}%
{%
\ifglsused{\thislabel}%
{%
\ifglshasfield{see}{\thislabel}%
{\expandafter\seeref\glscurrentfieldvalue|\thislabel|}{}%
}%
{}%
}%
}
}
\begin{document}
\printglossary[type=acronym]
\printglossary
\newpage
\section{Tester}
Test \gls{CAD}.
Test \gls{CAD}.
Test \gls{FEM}.
Test \gls{PKW}.
\end{document}
第 1 页:
第 2 页顶部:
第 2 页底部:
方法 3:使用bib2gls
如果使用 ,则不会出现此问题bib2gls
,但需要在.bib
文件中定义条目。可以使用 定义常规条目@entry
。例如:
@entry{foo,
name={foo},
description={foo description}
}
缩写可以用 来定义@abbreviation
。例如:
@abbreviation{PKW,
short={PKW},
long={Personenkraftwagen}
}
可以使用以下方式定义双重条目和缩写@dualabbreviationentry
:
@dualabbreviationentry{FEM,
short={FEM},
long = {Finite Elemente Methode},
description = {Numerisches Berechnungsverfahren, um Spannungen und Kräfte in und zwischen Bauteilen zu ermitteln}
}
因此,创建一个名为的文件,abbreviations.bib
其中包含:
% Encoding: UTF-8
@dualabbreviationentry{FEM,
short = {FEM},
long = {Finite Elemente Methode},
description = {Numerisches Berechnungsverfahren,
um Spannungen und Kräfte in und zwischen Bauteilen zu ermitteln},
see={[Glossar:]dual.FEM}
}
@dualabbreviationentry{CAD,
short = {CAD},
long = {Computer Aided Design},
description = {Zu Deutsch rechnerunterstütztes Konstruieren. Das
computergestützte erstellen von 3D-Modellen},
see={[Glossar:]dual.FEM}
}
@abbreviation{PKW,
short = {PKW},
long = {Personenkraftwagen}
}
该文档(简化版)如下:
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{hyperref}
\usepackage[record,% use bib2gls
abbreviations,% create list of abbreviations
nostyles,% only need list style so don't load others
stylemods={list},% load glossary-list.sty
style=list]{glossaries-extra}
\GlsXtrLoadResources
[
src = {abbreviations} % entry definitions in abbreviations.bib
]
\begin{document}
\printunsrtglossary[type=abbreviations]
\printunsrtglossary
\newpage
\section{Tester}
Test \gls{CAD}.
Test \gls{CAD}.
\end{document}
文档构建为:
pdflatex myDoc
bib2gls myDoc
pdflatex myDoc
这并不完全匹配,因为它see
在两个条目中重复了字段:
更好的方法是省略字段see
并调整样式以检查双重条目。这使代码更加灵活。@dual...
条目类型通过 链接,bib2gls
因此如果您在文档中索引一个,则另一个也会自动选择。可以使用 保存链接条目的标签dual-field
。
该abbreviations.bib
文件现在如下所示:
% Encoding: UTF-8
@dualabbreviationentry{FEM,
short = {FEM},
long = {Finite Elemente Methode},
description = {Numerisches Berechnungsverfahren,
um Spannungen und Kräfte in und zwischen Bauteilen zu ermitteln}
}
@dualabbreviationentry{CAD,
short = {CAD},
long = {Computer Aided Design},
description = {Zu Deutsch rechnerunterstütztes Konstruieren. Das
computergestützte erstellen von 3D-Modellen}
}
@abbreviation{PKW,
short = {PKW},
long = {Personenkraftwagen}
}
该文件现为:
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{hyperref}
\usepackage[record,% use bib2gls
abbreviations,% create list of abbreviations
nostyles,% only need list style so don't load others
stylemods={list},% load glossary-list.sty
style=list]{glossaries-extra}
\GlsXtrLoadResources
[
src = {abbreviations}, % entry definitions in abbreviations.bib
dual-field={dualid}% save label of dual entry in this field
]
\newcommand{\glsxtrpostnamegeneral}{%
\ifglshasfield{dualid}{\glscurrententrylabel}%
{ (\glshyperlink{\glscurrentfieldvalue})}%
{}%
}
\renewcommand{\glsxtrpostdescabbreviation}{%
\ifglshasfield{dualid}{\glscurrententrylabel}%
{ (\textit{Glossar:}
\glshyperlink[\glsentryname\glscurrentfieldvalue]{\glscurrentfieldvalue})}%
{}%
}
\begin{document}
\printunsrtglossary[type=abbreviations]
\printunsrtglossary
\newpage
\section{Tester}
Test \gls{CAD}.
Test \gls{CAD}.
\end{document}
这提供了从一个列表中的条目到另一个列表中的相应条目的链接(如下方红色矩形所示):
或者,您可以将描述设为超链接以删除重复:
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{hyperref}
\usepackage[record,% use bib2gls
abbreviations,% create list of abbreviations
postdot,% add full stop (period) after description
nostyles,% only need list style so don't load others
stylemods={list},% load glossary-list.sty
style=list]{glossaries-extra}
\newcommand{\bibglsnewdualabbreviationentry}[5]{%
\newabbreviation
[#2,description={\bibglshyperlink{#4}{\glsxtrusefield{#1}{dualid}}}]
{#1}{#3}{#4}%
}
\GlsXtrLoadResources
[
src = {abbreviations}, % entry definitions in abbreviations.bib
dual-field={dualid},% save label of dual entry in this field
dual-backlink
]
\newcommand{\glsxtrpostnamegeneral}{%
\ifglshasfield{dualid}{\glscurrententrylabel}%
{ (\glshyperlink{\glscurrentfieldvalue})}%
{}%
}
\begin{document}
\printunsrtglossary[type=abbreviations]
\printunsrtglossary
\newpage
\section{Tester}
Test \gls{CAD}.
Test \gls{CAD}.
\end{document}
上述文件引用了基本的条目(\gls{CAD}
),这是缩写,因此位置仅出现在缩写列表中,即“Computer Aided Design”后面的“2”:
缩写
计算机辅助设计计算机辅助设计。2
词汇表
计算机辅助设计(CAD)转为德语翻译设计。计算机图形学是由 3D 模型创建的。
您可以使用以下方法将其完全删除save-locations=false
:
\GlsXtrLoadResources
[
src = {abbreviations}, % entry definitions in abbreviations.bib
dual-field={dualid},% save label of dual entry in this field
dual-backlink,
save-locations=false
]
或者您可以合并位置,combine-dual-locations=both
以便缩写列表和词汇表都显示相同的位置列表:
\GlsXtrLoadResources
[
src = {abbreviations}, % entry definitions in abbreviations.bib
dual-field={dualid},% save label of dual entry in this field
dual-backlink,
combine-dual-locations=both
]
或者您可以使用combine-dual-locations=dual
将所有位置移动到双重列表(词汇表)或使用combine-dual-locations=primary
将所有位置移动到主列表(缩写列表)。
可以修改缩写样式以附加从双重条目获得的描述:
\newcommand{\glsxtrpostlinkabbreviation}{%
\glsxtrifwasfirstuse
{%
\ifglshasfield{dualid}{\glslabel}%
{\footnote{\glsentrydesc{\glscurrentfieldvalue}}}%
{}%
}%
{}%
}
您可以在第一次使用时将长格式和短格式设为斜体:
\renewcommand{\glsfirstlongdefaultfont}[1]{\emph{#1}}
\renewcommand{\glsfirstabbrvdefaultfont}[1]{\emph{#1}}
缩写样式应始终在之前设置\GlsXtrLoadResources
完成 MWE:
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[colorlinks]{hyperref}
\usepackage[record,% use bib2gls
abbreviations,% create list of abbreviations
postdot,% add full stop (period) after description
nostyles,% only need list style so don't load others
stylemods={list},% load glossary-list.sty
style=list]{glossaries-extra}
\setabbreviationstyle{long-short}
\newcommand{\glsxtrpostlinkabbreviation}{%
\glsxtrifwasfirstuse
{%
\ifglshasfield{dualid}{\glslabel}%
{\footnote{\glsentrydesc{\glscurrentfieldvalue}}}%
{}%
}%
{}%
}
\renewcommand{\glsfirstlongdefaultfont}[1]{\emph{#1}}
\renewcommand{\glsfirstabbrvdefaultfont}[1]{\emph{#1}}
\newcommand{\bibglsnewdualabbreviationentry}[5]{%
\newabbreviation
[#2,description={\bibglshyperlink{#4}{\glsxtrusefield{#1}{dualid}}}]
{#1}{#3}{#4}%
}
\GlsXtrLoadResources
[
src = {abbreviations}, % entry definitions in abbreviations.bib
dual-field={dualid},% save label of dual entry in this field
dual-backlink
]
\newcommand{\glsxtrpostnamegeneral}{%
\ifglshasfield{dualid}{\glscurrententrylabel}%
{ (\glshyperlink{\glscurrentfieldvalue})}%
{}%
}
\begin{document}
\printunsrtglossary[type=abbreviations]
\printunsrtglossary
\newpage
\section{Tester}
Test \gls{CAD}.
Test \gls{CAD}.
\end{document}