cleverefのcrefと全角カンマのスペースを狭めたい

cleverefのcrefと全角カンマのスペースを狭めたい

- 石井 徹 の投稿
返信数: 9

初めまして。
cleverefパッケージの\crefコマンド利用時のラベル間のスペースについてお尋ねしたい事があり投稿しました。

\crefコマンドを使って複数のラベルを参照し、ラベルの間をカンマで区切ろうとしています。この時、参照したラベルとカンマの間のスペースが広くなりすぎてしまいます。このスペースを\refコマンドのあとにカンマを打ったときと同じスペースにするにはどのようにすればよいのでしょうか。

次がLaTeXのソースファイルで、添付は出力結果です。

\documentclass[a4paper]{jsarticle}
\usepackage{cleveref}
\newcommand{\crefrangeconjunction}{--}
\newcommand{\crefpairconjunction}{,}
\newcommand{\crefmiddleconjunction}{--}
\newcommand{\creflastconjunction}{,}
\crefformat{enumi}{#2(#1)#3}
\crefrangeformat{enumi}{#3(#1)#4--#5(#2)#6}
\crefmultiformat{enumi}{#2(#1)#3}{,#2(#1)#3}{,#2(#1)#3}{,#2(#1)#3}
\begin{document}
\begin{enumerate}
 \item \texttt{\textbackslash cref}に\label{enum:1}
 \item 複数のラベルを指定すると\label{enum:2}
 \item スペースが\label{enum:3}
 \item 広くなりすぎてしまいます\label{enum:4}
\end{enumerate}
参照すると次のようになります。\\
\texttt{\textbackslash cref}(まとめて):\\
\cref{enum:1,enum:2,enum:4}\\
%
\texttt{\textbackslash cref}(個別に):\\
\cref{enum:1},\cref{enum:2},\cref{enum:4}\\
%
\texttt{\textbackslash ref}(期待出力):\\
(\ref{enum:1}),(\ref{enum:2}),(\ref{enum:4})
\end{document}
環境は次のとおりです。

OS: Windows 10 (64bit)
LaTeX環境: TexLive 2017
コンパイル手順:
  1. platex sample.tex
  2. platex sample.tex
  3. dvipdfmx sample.dvi

どうかご教示の程をよろしくお願いします。
石井 徹 への返信

Re: cleverefのcrefと全角カンマのスペースを狭めたい

- 飯島 徹 の投稿
\cref*format{enumi}{...} において全角の"("と")"を用いて定義していますが,次のように半角にするとほぼ期待通りになると思います

\crefformat{enumi}{#2(#1)#3}
\crefrangeformat{enumi}{#3(#1)#4--#5(#2)#6}
\crefmultiformat{enumi}{#2(#1)#3}{,#2(#1)#3}{,#2(#1)#3}{,#2(#1)#3}
飯島 徹 への返信

Re: cleverefのcrefと全角カンマのスペースを狭めたい

- 石井 徹 の投稿
ありがとうございます。
頂いたとおり、丸括弧を半角に変更するとスペースは期待通りとなりました。

しかしながら約物を変えず、スペースだけを\refとカンマを使ったものと同じ幅にする方法はないものでしょうか。

約物を変えたくない理由は、投稿規定の全角指定に従ったり、
提供されているスタイルファイルの表記に揃えたりしたいためです。
例えばIEICEのスタイルファイルだと、enumerate環境の数値は全角の丸括弧を使って囲まれている((1)何々 (2)何々… のようになっています)ので、参照時にも全角で囲みたいと思っています。

もしもよろしければお知恵を拝借したいです。


石井 徹 への返信

Re: cleverefのcrefと全角カンマのスペースを狭めたい

- 本田 知亮 の投稿
入力が不自然になっているところとか,
「)」のコードの取得とか
\lastskipで「引いている」とか
個人的にはいやな感じが捨てきれないですが
他に思つかないのでアップします.
creveref.styに直接手を入れないで
処置するなら,ひとまずはこんな感じかもしれません.

本質的には
)\relax,\relax(
の「,」の前後に何かを施して
),(
と同じ結果をえるということでしょうから
\lastnodecharがないと厳しいと思います.

本田 知亮 への返信

Re: cleverefのcrefと全角カンマのスペースを狭めたい

- 本田 知亮 の投稿
追加:
禁則は何も考えてません.
本田 知亮 への返信

Re: cleverefのcrefと全角カンマのスペースを狭めたい

- 石井 徹 の投稿
ありがとうございます。
設定がまずいのか、と思っていたのですがプログラムよりのお話だったのですね。

TeXの処理内容については不勉強で、調べ調べの理解なのですが、
今回のスペースが広くなりすぎる問題は、
  1. 文字間に挿入されるスペースの大きさは連続する文字の種類(漢字や括弧等)で決められているが、
  2. \crefを使うと「)」と「,」が連続せず、間に別の文字が入る(頂いた例示によると\relax)ために、
  3. 想定した「),」とは連続する文字の種類が異なる「)\relax,」に対してスペースを調整するので広くなりすぎてしまう
ということでしょうか。

自動的に行われる2.のために、\relaxのスペース挿入分を引いてしまおうという頂いた方法で欲しい出力が得られました。

ただし、「いやな感じ」がまだ理解できないのと、禁則時にうまくいかないらしい、とのことで使用するにはもう少しTeXを知ってからのほうが良さそうです。
(入力で「\<」や「\adjust」を使う方法は確かに忘れそうだな、と思いました。しかし、「\cref{label1,label2}」とする分には問題なさそうです。\lastskipで引くのもTeXとしてはいやな感じがする方法なのでしょうか。)

本当にありがとうございました。
石井 徹 への返信

Re: cleverefのcrefと全角カンマのスペースを狭めたい

- 本田 知亮 の投稿
細かいことは省きますが

「1.」についてはその通りです
「2.」については
creverefの実際の処理では\relaxではないですが
組版結果に現れない何かが挿入されるという意味で
\relaxで代替して表現したということです

\lastskipで引くのがいやだというのは
一度隙間を入れてからその隙間の分を戻す
というのがいやだということです
本当なら
「隙間を入れない」または
「入った隙間そのものを削除する」
ようにしたいのです.

禁則に関しては,「,」の前に
\hskipを入れているので
まずいだろうなと思っています.

本田 知亮 への返信

Re: cleverefのcrefと全角カンマのスペースを狭めたい

- 石井 徹 の投稿
詳しくご説明を下さりありがとうございます。
いやな感じについて理解できました。

隙間が入ってしまうと、後で隙間を引いても禁則処理が行われなくなってしまうのですね。
添付のように「)」と「,」の間に\hskipによる隙間詰めマクロ\adjustを挿入したものを繰り返すと、禁則が破られることが確認できました。

何故スペースが広くなってしまうのか、良くわかりました。また取りうる方法と注意点についても理解できました。

本当にありがとうございました。
石井 徹 への返信

Re: cleverefのcrefと全角カンマのスペースを狭めたい

- 本田 知亮 の投稿
\hskip-\lastskip
なんてやっているところをすべて
\unskip
にするとたぶん大丈夫です

#なんで\unskipが効かないと思い込んでいたんだろう
本田 知亮 への返信

Re: cleverefのcrefと全角カンマのスペースを狭めたい

- 石井 徹 の投稿
ありがとうございます。
頂いたとおりに変更すると期待通り、
「),」と同じスペース幅であり、かつ禁則が守られることが確認できました。

[1]によると、\unskipは文字間のスペースを生んでいたグルー自体を削除するものとのことで、以前頂いていた本来の意図:
本当なら
「隙間を入れない」または
「入った隙間そのものを削除する」
ようにしたいのです.
に沿ってスペースが調整できるコマンドのようですね。

まさに期待通りの出力でした。
本当にありがとうございました。