upmendex の挙動について

upmendex の挙動について

- でび まる の投稿
返信数: 4

でびまる といいます。最初は用語集的なもので、日本語の用語に(例えば)英語の
用語を対応させ対訳用語集の様なものが無いかと思い探していました。
そもそも用語集のパッケージが少なく、あっても日本語の解説はほぼ無くて、全く
状況は分ってないのですが、日本語対応はともかく比較的新しい glossaries
が使えないかと思い調べてみました。
非常に大雑把に言うと glossaries パッケージを使う foo.tex を作成し
latex foo; makeglossaries foo; latex foo
で用語集が作成されます。更に makeglossaries は Perl なので、もし
Perl がないシステムなら
makeindex -s foo.ist -t foo.glg -o foo.gls foo.glo
で代用するとありました。そこで日本語を使って upmendex にすれば
どうなるか試してみたのですが makeindex と upmendex の挙動が違う
様に思うのでご教示いただければと思います。
以下の英語のみの sample.tex を作成し
----------------------
\documentclass[a4paper]{article}
\usepackage{glossaries}

\makeglossaries

\newglossaryentry{glossary}{name=glossary,
description={set of technical terms},
plural={glossaries}}

\begin{document}

A \gls{glossary}, plural
\glspl{glossary}, is a very useful addition to any technical
document.

\printglossaries

\end{document}
----------------------
latex sample して出来る sample.glo に makeindex を使った場合と
upmendex を使った場合に生成される sample.gls が違っているので、
その結果次の latex sample で upmendex 版はエラーになります。
makeindex などはほぼ使わないので知識も無いのですが、英文に対しては
upmendex も同じ挙動だと思ってたのですがこの様な違いがあるのでしょうか。

参考に比較しやすい様に makeindex 版を esample.tex, upmendex 版を
upsample.tex にして glossaries 関係の生成されたファイルを添付して
おきます(*.gls だけで十分かも分りませんが)。
質問が明確でない気がしますし、誤解してる、あるいはもっと違う方向が
あるかも分りませんが、何かあればご教示よろしくお願いします。

でび まる への返信

Re: upmendex の挙動について

- t tk の投稿
ご報告ありがとうございます。
サンプルをざっと眺めた程度ですが、 upmendex の heading_prefix, heading_suffix の取り扱いに問題があるかもしれません。
該当部分は、upmendexのフォーク元の mendex (ASCII社さんによる) でも upmendex と同様の気がします。
調査には時間が掛かりそうです。
t tk への返信

Re: upmendex の挙動について

- でび まる の投稿

返信ありがとうございます。

> mendex (ASCII社さんによる) でも upmendex と同様の気がします。

はい、mendex でも同じでした。よろしくお願いします。

でび まる への返信

Re: upmendex の挙動について

- はやて (h20y6m) の投稿
upmendex のしらないエスケープ `\{` などの扱いにバグがあるようです。

https://github.com/texjporg/tex-jp-build/blob/55827709ec8126359a292f8e0bd3e2ddf416c587/source/texk/upmendex/styfile.c#L275-L282

else if (buff1[i]=='\\' && !escape_mode) {
i++;
if (buff1[i]=='\\') buff2[j]='\\';
else if (buff1[i]=='n') buff2[j]='\n';
else if (buff1[i]=='t') buff2[j]='\t';
else if (buff1[i]=='r') buff2[j]='\r';
else if (buff1[i]=='\"') buff2[j]='\"';
}

知らないエスケープのときに文字がセットされずゴミが入っていそうです。
ゴミが `\0` のときに文字列がそこで終端されている気がします。

makeindex は `\t`, `\n` 以外は単に `\` をとっているだけに見えます。