texjporg / platex

pLaTeX community edition
BSD 3-Clause "New" or "Revised" License
49 stars 8 forks source link

\verb の冒頭の空白 #49

Closed aminophen closed 6 years ago

aminophen commented 7 years ago

本家 LaTeX2e の \verb の定義には

\relax \ifmmode \hbox \else \leavevmode \null \fi …(以下略)

というように \null があります。この理由は,TeX.SX のここに書かれている通り,「\verb| abc| と書いた場合に冒頭のスペースが消えないようにするため」です(回答自体は Heiko Oberdiek 氏の推察によりますが,コメントにある通り Frank Mittelbach 氏がその通りだと認めています)。

pLaTeX はまさにこの \null を消しているので,\verb の冒頭の空白が消滅します。例示ソース:

\documentclass{article}
\parindent0pt
\begin{document}

  x\linebreak
  \begingroup
    \verb| |y
  \endgroup

\end{document}

% 一応補足ですが,上記 TeX.SX にある MWE は

\documentclass{article}
\begin{document}
  \noindent x\\
  \begingroup
    % \let\null\relax
    \verb| |y
  \endgroup
\end{document}

となっていますが,これは LaTeX と(現行の)pLaTeX で差が出ません。この理由は \\ の定義が違っているからで,\@gnewline に追加された \null の影響です。(参考: #27 )

aminophen commented 7 years ago

(LaTeX と pLaTeX で違いが出るので issue にしましたが,これは解消不能な予感がします。ただ,「違いが出る」という事実認識の共有と,必要とあらばドキュメントに書いておこう,という考えから立てたものです。)

h-kitagawa commented 7 years ago

確か \null を消した理由って,和欧文間空白を挿入する処理が \null を透過しないことでしたから,次の 2 条件を同時に満たすものを挿入すれば良いと思います.

とりあえず \vadjust{} ではどうなのだろう,と言ってみる.

\documentclass{article}
\makeatletter
\def\myverb#1{\relax\ifmmode\hbox\else\leavevmode#1\fi
  \bgroup
    \verb@eol@error \let\do\@makeother \dospecials
    \verbatim@font\@noligs
    \language\l@nohyphenation
    \@ifstar\@sverb\@verb}
\def\TEST#1{\scantokens{%
  x\linebreak
  \begingroup
    \myverb{#1}| |y% \verb の冒頭の空白
  \endgroup

  あ\myverb{#1}|a|い% \verb の前の和欧文間空白
  \par
}}

\begin{document}
\parindent0pt\xkanjiskip=10pt % 強調

\TEST{\null}% \LaTeX
\TEST{} % pLaTeX
\TEST{\vadjust{}}

\end{document}
aminophen commented 7 years ago

ありがとうございます。テストのため 033fdde で exppl2e.sty に入れてみました。

aminophen commented 6 years ago

256c0f0 でカーネルへ移し,jltxdoc.cls の方の定義もこれに合わせ \vadjust{} を追加しました。