kmuto/review

code内の空白幅が変

Closed this issue · 11 comments

@<code>{} 内の空白幅が、空白直前の記号によって半角幅になったり全角幅になったりしてしまいます。

実験したRe:VIEW文書

 * @<code>{a b: c; d~ e. f, g}
 * @<code>{01234567890123456789}

rake pdf の結果
image

:. で、後続の半角空白が全角幅になっていることが分かります。
Re:VIEW バージョンは 5.7.0、環境は Ubuntu 20.04 on WSL2 です。

latexが文中の記号と文末の記号のスペース幅を区別するため、そうなっているっぽいですね。

latexレベルでは、\frenchspacingを追加するとよい、という記述を見かけました。

 * @<code>{a b: c; d~ e. f, g}
 * @<code>{01234567890123456789}

@<embed>{\frenchspacing}

 * @<code>{a b: c; d~ e. f, g}
 * @<code>{01234567890123456789}

Screenshot 2024-02-12 at 18 41 33

@kdmsnr
ありがとうございます!今回の件はこれでばっちり解決しました。

※回避策があるので実務的には困らないようになりました。
ただ、codeタグの中で空白幅が異なるのはバグと思いますので、長期的に直れば嬉しいなと思います。

ただ、codeタグの中で空白幅が異なるのはバグと思いますので、長期的に直れば嬉しいなと思います。

Re:VIEWからはlatexにそのまま内容を渡しているだけですし、素のlatexでも再現しますので、Re:VIEWのバグではないんですよね。

どのようにワークアラウンドするのがベストかは @kmuto さんに聞きたいです。

@<code>{...} の出力結果の前後に \frenchspacing\nonfrenchspacing を導入する、というのはアリかも?

@kdmsnr
現状のRe:VIEW標準な\reviewcode{...}@<code>{...})ならば、ひとまず、

\DeclareRobustCommand{\reviewcode}[1]{{\frenchspacing\ttfamily\reviewbreakall{#1}}}
%% \nonfrenchspacingは不要ですね。\bgroup\frenchspacing...\egroupなので。

としておけば、どうでしょうか。

\begin{document}
\begin{itemize}
\item \texttt{a b: c; d\textasciitilde{} e. f, g}
\item \texttt{01234567890123456789}
\item \reviewcode{a b: c; d\textasciitilde{} e. f, g}
\item \reviewcode{01234567890123456789}
\item \texttt{a b: c; d\textasciitilde{} e. f, g}
\item \texttt{01234567890123456789}
\end{itemize}
\end{document}

@munepi

ありがとうございます。それがよさそうですね。

文書全体に \frenchspacing を設定したくなったら、また考える感じですかね。

munepei さんの解決策はかなり良い妥当な感じに思えます!

Re:VIEWからはlatexにそのまま内容を渡しているだけですし、素のlatexでも再現しますので、Re:VIEWのバグではないんですよね。

これについてですが、やはりRe:VIEWのバグと言えると思っています。
なぜなら、あくまでも@<code>{}の仕様は「囲まれた文字列を等幅フォントで出力する」であって、「latexにそのまま渡す」ではないはずです。

latexにそのまま渡しているのは、単に現状の実装がそうなっているというだけです。
latexは文中空白と文末空白で幅を変えることが仕様なわけですから、そういう仕様のソフトウェアをバックエンドとして利用する以上、@<code>{}の仕様を満たすために何らかの工夫をするのはRe:VIEWの責任範囲なのではないかと思います。

ひとまず、PR #1907 のとおり、現状のRe:VIEW標準の\reviewcodeの類のコマンドも同様に変更しておけばよいと思います。

これについてですが、やはりRe:VIEWのバグと言えると思っています。

現状のRe:VIEW標準の\reviewcode{...}@<code>{...})は、ある種の\texttt{...}通常の入力された文字列としてLaTeXに組版してもらっています(\texttt\verb/verbatimではない)。

Note

lmtt10の標準なTeX font metric(T1 encodingなら、rm-lmtt10)がそうなっているからですね。
「. (period+space)」は、「.」のあとにSPACE 0.525+EXTRASPACE 0.525が入るので、空白2つ分となります。
逆に、(必要であれば別名にして)EXTRASPACE 0.0としたfont metricを作ると、「. (period+space)」は空白1つ分となります。

反応遅くなりました、利用用途を考えると等幅キープしてほしいというほうが自然だと思うので、munepiさんパッチを採用させていただく予定です(いつもありがとうございます!)。

@kmuto 本件に対する直接的な PR #1907 を適用する前に、 #1907 (comment) に対する別のパッチ(間接的にPDF栞に影響する)も同梱します。

#1907 の修正を取り込みました。