texjporg / platex

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

tabbing 環境の JFM グルーの入り方 #53

Open aminophen opened 7 years ago

aminophen commented 7 years ago

現行では、tabbing 環境の各行で最初のモノだけ冒頭 JFM グルーが残り、以降のモノは消えます。最近 #43 で tabular 環境を修正したので、tabbing 環境も修正したいと思います。

\documentclass{article}
%\usepackage{bxjaprnind}% これを入れても効かない!
\begin{document}
\begin{tabbing}
あああああ+++\=あああああああ+++++\=あああああ\kill
(あ) \> (あ) \> (あ) \\
(あ)\>(あ)\>(あ)\\
あああ \> あああ \> あああ \\
あああ\>あああ\>あああ
\end{tabbing}
\end{document}

明日 8/27 までにコードが間に合えば、exppl2e.sty に入れた状態にする予定です。

aminophen commented 7 years ago

上の例はさしあたり

\gdef\@startline{%
     \ifnum \@nxttabmar >\@hightab
       \@badtab
       \global\@nxttabmar \@hightab
     \fi
     \global\@curtabmar \@nxttabmar
     \global\@curtab \@curtabmar
     \global\setbox\@curline \hbox {}%
     \@startfield
     \strut\inhibitglue}

のように \@startline の末尾に \inhibitglue を追加すれば ok ですね。これで十分なのかな?

aminophen commented 7 years ago

「最初の要素の左側」とは別に、今度は「要素の右側」の JFM グルーが気になってきました。

pLaTeX カーネルは \@stopfield を再定義しています。この影響で「で終わるモノを右寄せする」というときにその配置が \null の影響で変化しています。これは意図したものなのでしょうか?

%\makeatletter
% LaTeX
%\gdef\@stopfield{\color@endgroup\egroup}
% pLaTeX
%\gdef\@stopfield{\null\color@endgroup\egroup}
%\makeatother
\documentclass{jarticle}
\begin{document}
\verb+\'+の前後に空白があるとき
\begin{tabbing}
ほげほげほげ \= ほげほげほげほげ \= ほげほげ \= ほげほげほげほげほげ \\
(一) \> (二) \> (三) \> (四) \+\+\\
(三) \> (四) \\
(二右) \' (三) \> (四)
\end{tabbing}
\verb+\'+の前後に空白がないとき
\begin{tabbing}
ほげほげほげ \= ほげほげほげほげ \= ほげほげ \= ほげほげほげほげほげ \\
(一)\>(二)\>(三)\>(四)\+\+\\
(三)\>(四)\\
(二右)\'(三)\>(四)
\end{tabbing}
\end{document}

さらに、アラインメント区切り命令の周囲の“半角空白”有無で変わります。 これは pdflatex でも起きる現象のようですが、意図どおりなのだろうか…? → これは意図どおりとのことです。

%#!pdflatex
\documentclass{article}
\begin{document}

with spaces
\begin{tabbing}
1++++++++++++ \= 2+++++++ \= 3+++++++++++ \\
first \> second \> third \+\\
second \> third \\
first \' second \> third
\end{tabbing}

without spaces
\begin{tabbing}
1++++++++++++ \= 2+++++++ \= 3+++++++++++ \\
first\>second\>third\+\\
second\>third\\
first\'second\>third
\end{tabbing}

\end{document}

…で、それは \unskip を入れておけば解消できるみたい。

\gdef\@tablab{%
  \unskip
  \@stopfield
  \global\setbox\@curline\hbox{%
    \box\@curline
    \hskip-\wd\@curfield \hskip-\tabbingsep
    \box\@curfield
    \hskip\tabbingsep}%
  \@startfield
  \ignorespaces}
aminophen commented 6 years ago

とりあえず,tabbing 先頭の JFM グルーを消すコードをカーネルに移しました。

さて,plcore.dtx に

相互参照や疑似タイプ入力では、和欧文間スペースが入らないので、\null を取り 除きましたが、tabbing 環境では、逆に \null がないため、和欧文間スペースが 入ってしまうので、それを追加します。

とあるのですが,この「\null がないと和欧文間スペースが入ってしまう」とはどんなソースで確認できるのでしょうか? 少なくとも \null の影響で,ここに書いたような「末尾に JFM グルーが来た場合」の挙動が変化しているわけですが,他にも \null が意図しない変化を生んでいたりしないかが心配です。

aminophen commented 6 years ago

「\null がないと和欧文間スペースが入ってしまう」とはどんなソースで確認できるのでしょうか?

ようやく理解しました。LaTeX のママだと要素間に \xkanjiskip が入る行と入らない行ができてしまい,「かきくけこ」と「カキクケコ」が揃わなくなっていますが,pLaTeX だと要素間の \xkanjiskip が一律に抑制され,揃うようになっているということですね。

\documentclass{jarticle}
\def\TEST{%
\begin{tabbing}
あいう\=AAA\=かきくけこ\=さし\\
アイウ\>AAA\>カキクケコ\>サシ
\end{tabbing}}
\begin{document}
\makeatletter

% LaTeX
\gdef\@stopfield{\color@endgroup\egroup}
\TEST

% pLaTeX
\gdef\@stopfield{\null\color@endgroup\egroup}
\TEST

\end{document}

ということは,この意図を壊さずに右寄せ \' を修正するには…?

aminophen commented 6 years ago

pLaTeX と LuaTeX-ja の間でなるべく共通な方がわかりやすいと思ったので,両方でいろいろ処理してみることにしました。結果的に,以下のコード(pLaTeX dev と記したもの)にたどり着きました。

比較上の便宜のため,本家 LaTeX のコードや現行の pLaTeX のコードを併記しています。(LuaTeX-ja は pLaTeX dev のコードを使わないとタブが揃わないような気が…?)

\documentclass{article}
\ifx\directlua\undefined\else\usepackage{luatexja}\fi
\begin{document}

\makeatletter
%
%% \@startline patch
% LaTeX
\gdef\@startline{%
     \ifnum \@nxttabmar >\@hightab
       \@badtab
       \global\@nxttabmar \@hightab
     \fi
     \global\@curtabmar \@nxttabmar
     \global\@curtab \@curtabmar
     \global\setbox\@curline \hbox {}%
     \@startfield
     \strut}
% pLaTeX dev
\gdef\@startline{%
     \ifnum \@nxttabmar >\@hightab
       \@badtab
       \global\@nxttabmar \@hightab
     \fi
     \global\@curtabmar \@nxttabmar
     \global\@curtab \@curtabmar
     \global\setbox\@curline \hbox {}%
     \@startfield
     \strut\inhibitglue}
%
%% \@stopfield patch
% LaTeX
\gdef\@stopfield{\color@endgroup\egroup}
% pLaTeX
\gdef\@stopfield{\null\color@endgroup\egroup}
% pLaTeX dev
\gdef\@stopfield{%
  \inhibitglue
  \@tempskipa\lastskip\unskip
  \hskip\@tempskipa
  \color@endgroup\egroup}
%
\makeatother

\tabbingsep15pt

% ===== test for \xkanjiskip and alignment =====

\def\TEST{%
\begin{tabbing}
あいう\=AAA\=かきくけこ\=さし\\
アイウ\>AAA\>カキクケコ\>サシ
\end{tabbing}}

% ===== test for JFM glue and alignment =====

\def\TESTA{%
[1]
\begin{tabbing}
ほげほげほげ \= ほげほげほげほげ \= ほげほげ \= ほげほげほげほげほげ \\
(一) \> (二) \> (三) \> (四) \+\+\\
(三) \> (四) \\
(二右) \' (三) \> (四)
\end{tabbing}

[2]
\begin{tabbing}
ほげほげほげ \= ほげほげほげほげ \= ほげほげ \= ほげほげほげほげほげ \\
(一)\>(二)\>(三)\>(四)\+\+\\
(三)\>(四)\\
(二右)\'(三)\>(四)
\end{tabbing}

[3]
\begin{tabbing}
ほげほげほげ\=ほげほげほげほげ\=ほげほげ\=ほげほげほげほげほげ\\
(一) \> (二) \> (三) \> (四) \+\+\\
(三) \> (四) \\
(二右) \' (三) \> (四)
\end{tabbing}

[4]
\begin{tabbing}
ほげほげほげ\=ほげほげほげほげ\=ほげほげ\=ほげほげほげほげほげ\\
(一)\>(二)\>(三)\>(四)\+\+\\
(三)\>(四)\\
(二右)\'(三)\>(四)
\end{tabbing}}

% ===== test for \tabbingsep compatibility =====

\def\TESTB{%
[1]
\begin{tabbing}
AAA \= BBBB \= CC \= DDDDD \\
A\>B\>C\>D\+\+\\
C\>D\\
rB\'C\>D
\end{tabbing}

[2]
\begin{tabbing}
AAA\=BBBB\=CC\=DDDDD\\
A\>B\>C\>D\+\+\\
C\>D\\
rB\'C\>D
\end{tabbing}

[3]
\begin{tabbing}
AAA \= BBBB \= CC \= DDDDD \\
A \> B \> C \> D \+\+\\
C \> D \\
rB \' C \> D
\end{tabbing}

[4]
\begin{tabbing}
AAA\=BBBB\=CC\=DDDDD\\
A \> B \> C \> D \+\+\\
C \> D \\
rB \' C \> D
\end{tabbing}}

\TEST
\TESTA\newpage
\TESTB

\end{document}