我正在尝试为我的文档中先前使用过的特定单词创建一本日语到英语的词典。
我使用词汇表包成功创建了英语到日语的版本,现在我想换一种方式。问题是,我无法在“名称”字段中输入日语字符,只能在“描述”字段中输入。如果可能的话,我想把它们放在名称字段中。
那是\newglossaryentry{aaa}{type=JtoE,name={},description={\begin{CJK}{UTF8}{min}あ\end{CJK}}}
有效的,但是\newglossaryentry{aaa}{type=JtoE,name={\begin{CJK}{UTF8}{min}あ\end{CJK}}},description={a}
不是有效的。
类似问题似乎有解决方案这里,但它在我的情况下不起作用;我在整个文档中都使用了 CJKutf8 包来处理日语字符,而且我不想回去彻底更改它。
当然,我希望名字中能够同时使用假名和汉字。
这是一个最小的工作示例。
\documentclass{article}
\usepackage{CJKutf8}
\usepackage[overlap, CJK]{ruby}
\renewcommand{\rubysep}{0.01ex}
\usepackage[nopostdot,nonumberlist]{glossaries}
\usepackage{glossary-mcols}
\setglossarystyle{mcolindex}
\newglossary*{EtoJ}{English to Japanese}
\newglossary*{JtoE}{Japanese to English}
\makenoidxglossaries
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% English to Japanese Gloss %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newglossaryentry{squareroot}
{
type=EtoJ,
name={squareroot},
description={\begin{CJK}{UTF8}{min}ルート\end{CJK}}%
}
\newglossaryentry{monomial}
{
type=EtoJ,
name={monomial},
description={\begin{CJK}{UTF8}{min}\ruby{単}{たん}\ruby{項}{こう}\ruby{式}{し
き}\end{CJK}}%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Japanese to English Gloss %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newglossaryentry{aaa}
{
type=JtoE,
name={},
description={\begin{CJK}{UTF8}{min}あ\end{CJK}}
}
\begin{document}
\glsaddall
\printnoidxglossary[type=EtoJ]
\newpage
\printnoidxglossary[type=JtoE]
%\printnoidxglossaries
\end{document}
答案1
\makenoidxglossaries
仅针对 ASCII 而设计。(请参阅切换到 \makenoidxglossaries 时没有打印的词汇表。) 评论推荐了xindy
,它是与包一起使用的三种索引方法中具有最佳多语言支持的方法glossaries
,但仍然存在一些问题。
如果我们首先不设置索引:
\documentclass{article}
\usepackage{CJKutf8}
\usepackage{glossaries}
\newglossaryentry{squareroot}{name={\begin{CJK}{UTF8}{min}ルート\end{CJK}},
description={square root}}
\begin{document}
\begin{CJK}{UTF8}{min}ルート\end{CJK}% for comparison
\gls{squareroot}
\end{document}
那么这将导致错误:
! Undefined control sequence.
\in@ #1#2->\begingroup \def \in@@
##1#1{}\toks@ \expandafter {\in@@ #2{}{}#1...
如果此错误发生在 中,\newglossaryentry
则问题通常是扩展问题。可以使用 关闭。如果字段需要格式化,\glsnoexpandfields
最好使用一个只接受一个参数的包装器命令。该值是从 中复制的,并且 部分将干扰整理器。name
sort
name
\begin{CJK}{UTF8}{min}
修改后的版本如下:
\documentclass{article}
\usepackage{CJKutf8}
\usepackage{glossaries}
\newrobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\glsnoexpandfields
\newglossaryentry{squareroot}{name={\cjkname{ルート}},
description={square root}}
\begin{document}
\begin{CJK}{UTF8}{min}ルート\end{CJK}
\gls{squareroot}
\end{document}
现在可以编译并生成:
下一步是添加代码来生成索引。 的目录列表xindy
显示modules/lang
:
albanian finnish icelandic mongolian spanish
belarusian french italian norwegian swedish
bulgarian general klingon persian turkish
croatian georgian korean polish ukrainian
czech german kurdish portuguese upper-sorbian
danish greek latin romanian vietnamese
dutch gypsy latvian russian
english hausa lithuanian serbian
esperanto hebrew lower-sorbian slovak
estonian hungarian macedonian slovenian
所以似乎不支持日语。最接近的是韩语。数字组需要关闭,因为它是为拉丁字母设计的:
\documentclass{article}
\usepackage{CJKutf8}
\usepackage[xindy={language={korean},glsnumbers=false}]{glossaries}
\makeglossaries
\newrobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\glsnoexpandfields
\newglossaryentry{squareroot}{name={\cjkname{ルート}},
description={square root}}
\begin{document}
\begin{CJK}{UTF8}{min}ルート\end{CJK}
\gls{squareroot}
\printglossaries
\end{document}
如果该文件名为test.tex
,则构建过程为:
pdflatex test
makeglossaries test
pdflatex test
makeglossaries-lite
(对于没有安装 Perl 的用户,还有一个 Lua 版本,但由于xindy
它也是一个 Perl 脚本,所以无论如何你都需要 Perl 解释器。)
或者你可以明确运行xindy
:
pdflatex test
xindy -L korean -C utf8 -I xindy -M test -t test.glg -o test.gls test.glo
pdflatex test
生成的文档如下所示:
创建的文件xindy
包含用于显示词汇表的代码:
\begin{theglossary}\glossaryheader
\glsgroupheading{default}\relax\glsresetentrylist
\glossentry{squareroot}{\glossaryentrynumbers{\relax
\glsXpageXglsnumberformat{}{1}}}%
\end{theglossary}\glossarypostamble
该\glsgroupheading{default}
部分显示xindy
无法识别日文字符,并将条目放入默认字母组中。这意味着您无法使用任何字母组样式,例如indexgroup
。它也可能表明它没有可以正确对ルート进行排序的规则。
还有第四个索引选项,那就是使用bib2gls
需要扩展包glossaries-extra
使用record
选项。bib2gls
是一个命令行应用程序(至少需要 Java 7)¹,可用于对条目进行排序和整理。此方法要求所有条目都在一个.bib
文件中定义。例如,假设调用的文件testcjk.bib
包含:
@entry{squareroot,
name={\cjkname{ルート}},
description={square root}
}
那么文档现在看起来像这样:
\documentclass{article}
\usepackage{CJKutf8}
\usepackage[record]{glossaries-extra}
\newrobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\glsnoexpandfields
\GlsXtrLoadResources[
src=testcjk,% bib file
sort={ja-JP}% locale
]
\begin{document}
\begin{CJK}{UTF8}{min}ルート\end{CJK}
\gls{squareroot}
\printunsrtglossaries
\end{document}
构建过程现在是:
pdflatex test
bib2gls test
pdflatex test
得出的结果为:
如果您想要字母组,您需要使用开关--group
:
pdflatex test
bib2gls --group test
pdflatex test
以及设置支持字母组(如indexgroup
)的词汇表样式。使用此--group
开关,此示例将bib2gls
以下代码写入由加载的文件中\GlsXtrLoadResources
:
\bibglssetlettergrouptitle{{ルー}{ルー}{9568256}{}}
这意味着bib2gls
认为“ルート”属于“ルー”字母组。我不懂日语,所以我不知道这是否正确,但组标题需要封装在环境中CJK
。扩展也是一个问题,因为日语字符在 中是有效的CJKutf8
。以下是修改后的示例:
\documentclass{article}
\usepackage{CJKutf8}
\usepackage[record,style=indexgroup]{glossaries-extra}
\newrobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\glsnoexpandfields
\newcommand{\bibglslettergrouptitle}[4]{\unexpanded{\cjkname{#1}}}
\GlsXtrLoadResources[
src=testcjk,% bib file
sort={ja-JP}% locale
]
\begin{document}
\begin{CJK}{UTF8}{min}ルート\end{CJK}
\gls{squareroot}
\printunsrtglossaries
\end{document}
构建过程现在是:
pdflatex test
bib2gls --group test
pdflatex test
生成的文档如下所示:
对于英语到日语的词汇表,如果直接交换name
,description
您可以将.bib
文件更改为
@dualentry{squareroot,
name={\cjkname{ルート}},
description={square root}
}
字母组标题仅应针对词汇表类型进行封装。这可以通过检查词汇表类型japanese
来处理:\bibglslettergrouptitle
\newcommand*{\englishlettergroup}[1]{#1}% heading used for `type=english`
\newcommand*{\japaneselettergroup}[1]{\cjkname{#1}}% heading used for `type=japanese`
\newcommand{\bibglslettergrouptitle}[4]{% #4 = type
\unexpanded{\csuse{#4lettergroup}{#1}}}
该文档文件现在是:
\documentclass{article}
\usepackage{CJKutf8}
\usepackage[record,style=indexgroup,nomain]{glossaries-extra}
\newglossary*{japanese}{Japanese to English}
\newglossary*{english}{English to Japanese}
\newrobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\glsnoexpandfields
\newcommand*{\englishlettergroup}[1]{#1}
\newcommand*{\japaneselettergroup}[1]{\cjkname{#1}}
\newcommand*{\bibglslettergrouptitle}[4]{\unexpanded{\csuse{#4lettergroup}{#1}}}
\GlsXtrLoadResources[
src=testcjk,% bib file
sort={ja-JP},% locale used to sort primary entries
dual-sort={en-GB},% locale used to sort secondary entries
type=japanese,% put the primary entries in the 'japanese' glossary
dual-type=english% put the dual entries in the 'english' glossary
]
\begin{document}
Japanese: \gls{squareroot}
English: \gls{dual.squareroot}
\printunsrtglossaries
\end{document}
(您可以只使用语言代码,而不使用地区:sort=ja,dual-sort=en
。)
得出的结果为:
如果需要,您可以更改默认双前缀dual.
。例如:
\documentclass{article}
\usepackage{CJKutf8}
\usepackage[record,style=indexgroup,nomain]{glossaries-extra}
\newglossary*{japanese}{Japanese to English}
\newglossary*{english}{English to Japanese}
\newrobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\glsnoexpandfields
\newcommand*{\englishlettergroup}[1]{#1}
\newcommand*{\japaneselettergroup}[1]{\cjkname{#1}}
\newcommand*{\bibglslettergrouptitle}[4]{\unexpanded{\csuse{#4lettergroup}{#1}}}
\GlsXtrLoadResources[
src=testcjk,% bib file
sort={ja-JP},% locale used to sort primary entries
dual-sort={en-GB},% locale used to sort secondary entries
type=japanese,% put the primary entries in the 'japanese' glossary
dual-type=english,% put the dual entries in the 'english' glossary
dual-prefix={en.}
]
\begin{document}
Japanese: \gls{squareroot}
English: \gls{en.squareroot}
\printunsrtglossaries
\end{document}
\cjkname
您可以在文件中提供 的定义.bib
,但需要保护它不受bib2gls
的解释器影响,以防止它干扰排序值。例如,如果文件defs-nointerpret.bib
包含:
@preamble{"\providerobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\providecommand*{\englishlettergroup}[1]{#1}
\providecommand*{\japaneselettergroup}[1]{\cjkname{#1}}
\providecommand*{\bibglslettergrouptitle}[4]{\unexpanded{\csuse{#4lettergroup}{#1}}}"}
那么文件现在是:
\documentclass{article}
\usepackage{CJKutf8}
\usepackage[record,style=indexgroup,nomain]{glossaries-extra}
\newglossary*{japanese}{Japanese to English}
\newglossary*{english}{English to Japanese}
\glsnoexpandfields
\GlsXtrLoadResources[
src={defs-nointerpret}, % bib file containing @preamble
interpret-preamble=false % write the @preamble contents but don't try to interpret
]
\GlsXtrLoadResources[
src=testcjk,% bib file
sort={ja-JP},% locale used to sort primary entries
dual-sort={en-GB},% locale used to sort secondary entries
type=japanese,% put the primary entries in the 'japanese' glossary
dual-type=english,% put the dual entries in the 'english' glossary
dual-prefix={en.}
]
\begin{document}
Japanese: \gls{squareroot}
English: \gls{en.squareroot}
\printunsrtglossaries
\end{document}
这会隐藏词汇表条目使用但未在文档中明确使用的命令。字母组标题的更通用方法是:
\newcommand*{\englishlettergroup}[1]{#1}
\newcommand*{\japaneselettergroup}{\cjklettergroup}
\newcommand*{\cjklettergroup}[1]{\cjkname{#1}}
\newcommand{\bibglslettergrouptitle}[4]{%
\unexpanded{%
\ifcsdef{#4lettergroup}%
{\csuse{#4lettergroup}{#1}}%
{\cjklettergroup{#1}}%
}%
}
这将使用\englishlettergroup
if type=english
、\japaneselettergroup
if type=japanese
,并且只会使用\cjklettergroup
iftype
是其他内容(例如 default main
)。因此该文件defs-nointerpret.bib
现在包含:
@preamble{"\providerobustcmd{\cjkname}[1]{\begin{CJK}{UTF8}{min}#1\end{CJK}}
\providecommand*{\englishlettergroup}[1]{#1}
\providecommand*{\japaneselettergroup}{\cjklettergroup}
\providecommand*{\cjklettergroup}[1]{\cjkname{#1}}
\providecommand{\bibglslettergrouptitle}[4]{%
\unexpanded{%
\ifcsdef{#4lettergroup}%
{\csuse{#4lettergroup}{#1}}%
{\cjklettergroup{#1}}%
}%
}"}
附录:迭代命令(例如)\glsaddall
不适用于该record
选项,因为在第一次运行 LaTeX 时没有定义任何条目,因此没有要迭代的内容。如果您想选择所有条目,无论它们是否已在文档中使用,请使用selection=all
:
\GlsXtrLoadResources[
src={testcjk},% bib file list
selection=all,% select all entries provided in this 'src' list
sort={ja-JP},% locale used to sort primary entries
dual-sort={en-GB},% locale used to sort secondary entries
type=japanese,% put the primary entries in the 'japanese' glossary
dual-type=english,% put the dual entries in the 'english' glossary
dual-prefix={en.}
]
请注意,\glsaddall
内部使用\glsadd
(始终将位置添加到位置列表)。这意味着nonumberlist
必须使用,否则词汇表中的每个条目中的位置都会相同。bib2gls
如果通过选择条目,则只有使用或selection=all
等命令在文档中对其进行索引时,它才会具有位置列表。\gls
\glsadd
¹ 请注意,Java 7 现已终止使用并被弃用。Java 8 包含对通用区域设置数据存储库 (CLDR) 的支持,该存储库可提供更广泛的区域设置支持。