kmuto / review

Re:VIEW is flexible document format/conversion system
http://reviewml.org/
GNU Lesser General Public License v2.1
1.33k stars 214 forks source link

code内の空白幅が変 #1906

Closed uchan-nos closed 7 months ago

uchan-nos commented 7 months ago

@<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 です。

kdmsnr commented 7 months ago

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

uchan-nos commented 7 months ago

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

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

kdmsnr commented 7 months ago

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

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

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

kdmsnr commented 7 months ago

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

munepi commented 7 months ago

@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}
kdmsnr commented 7 months ago

@munepi

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

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

uchan-nos commented 7 months ago

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

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

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

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

munepi commented 7 months ago

ひとまず、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つ分となります。

kmuto commented 7 months ago

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

munepi commented 7 months ago

@kmuto 本件に対する直接的な PR #1907 を適用する前に、 https://github.com/kmuto/review/pull/1907#issuecomment-1946617144 に対する別のパッチ(間接的にPDF栞に影響する)も同梱します。

kmuto commented 7 months ago

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