Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

\footnote の合印直後の改行 #16

Closed
aminophen opened this issue Aug 1, 2016 · 21 comments
Closed

\footnote の合印直後の改行 #16

aminophen opened this issue Aug 1, 2016 · 21 comments

Comments

@aminophen
Copy link
Member

ptex-texmf#2 の「脚注番号前後のアキ」の続き(?)です。

脚注番号の合印について

  • TeX Live 2012(旧仕様 pTeX + アスキー pLaTeX):両側とも \xkanjiskip 挿入なし
  • TeX Live 2013(新仕様 pTeX + アスキー pLaTeX):両側に \xkanjiskip が入る
  • TeX Live 2016(新仕様 pTeX + コミュニティ pLaTeX):両側に \null を置いて \xkanjiskip 禁止

でした。これについて、合印の前は「\null を置いて \xkanjiskip 禁止」が妥当である一方、後について疑問を呈する指摘をみかけました。たしかに、後に \null を置いたことで行分割が禁止されていることがわかります(platexrelease のエミュレートで違いを確認できます)。

%\RequirePackage[2016/03/31]{platexrelease}
\documentclass{jarticle}
\textwidth20zw
\parindent0zw
\begin{document}

1あああああああああああああああああああ\par
2あああああああああああああああああああ\footnote[1]{いいいいい}うううううううう\par
3あああああああああああああああああああ\footnote[1]{いいいいい}\\うううううううう

\end{document}
@h-kitagawa
Copy link
Member

安直ですが,後ろの \hbox の後に \penalty\z@ を置くのはどうでしょう?

\renewcommand\@makefnmark{%
  \ifydir \hbox{}\hbox{\@textsuperscript{\normalfont\@thefnmark}}\hbox{}\penalty\z@%
  \else\hbox{\yoko\@textsuperscript{\normalfont\@thefnmark}}\fi}

@aminophen
Copy link
Member Author

\penalty\z@ だと直後が句読点の場合(割とよく見かけます)がマズイですね。

4あああああああああああああああああああ\footnote[1]{いいいいい}。

@h-kitagawa
Copy link
Member

@makefnmark ではなく,@footnotetext の最後に \null を加えるとうまくいってそうな感じがしますが…….

%#!ptex2pdf -l footnote
\documentclass{jarticle}
\makeatletter
\long\def\@footnotetext#1{%
  \ifydir\def\@tempa{\yoko}\else\def\@tempa{\tate}\fi
  \insert\footins{\@tempa%
    \reset@font\footnotesize
    \interlinepenalty\interfootnotelinepenalty
    \splittopskip\footnotesep
    \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
    \hsize\columnwidth \@parboxrestore
    \protected@edef\@currentlabel{%
       \csname p@footnote\endcsname\@thefnmark
    }%
    \color@begingroup
      \@makefntext{%
        \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
    \color@endgroup}\null}

\textwidth20zw
\parindent0zw
\begin{document}

1あああああああああああああああああああ\par
4ああ\kern-.2zwあああああああああああああああああ\footnote[1]{いいいいい}.うううううううう\par
4ああ\kern.0zwあああああああああああああああああ\footnote[1]{いいいいい}.うううううううう\par
4ああ\kern.2zwあああああああああああああああああ\footnote[1]{いいいいい}.うううううううう\par
4ああ\kern.4zwあああああああああああああああああ\footnote[1]{いいいいい}.うううううううう\par

----------

4ああ\kern-.2zwあああああああああああああああああ\footnotemark[2].うううううううう\par
4ああ\kern.0zwあああああああああああああああああ\footnotemark[2].うううううううう\par
4ああ\kern.2zwあああああああああああああああああ\footnotemark[2].うううううううう\par
4ああ\kern.4zwあああああああああああああああああ\footnotemark[2].うううううううう\par

\end{document}

@aminophen
Copy link
Member Author

確かに \@makefnmark の後を外して、代わりに \@footnotetext の後に付けるとうまくいっています。なんだか不思議でよくわかっていませんが…

(luatexja.sty は beamer の関係で #36362\@footnotetext を外したようです。)

@aminophen
Copy link
Member Author

\@makefnmark の後を外して

ここを外してしまうと

2ああ\kern.4zwあああああああああああああああああ\footnotemark[1]うううううううう\par

のときに合印の後に変なアキが入ってしまいますね…ということは \@makefnmark は現状維持で \@footnotetext の後に \null を入れれば ok ということですね。不思議。

@h-kitagawa
Copy link
Member

簡単な

\documentclass{article} % 欧文 latex
\begin{document}
\tracingonline1 \showboxdepth \showboxbreadth10000
a\footnote{}b\showlists
\end{document}

でノードを見てみると,

\hbox(8.14003+0.0)x4.48613 []
\insert253, natural size 9.54001; split(6.65,2.85002); float cost 20000 []
\OT1/cmr/m/n/10 b

のように,\hbox(合印)→ \insert(脚注の中身)→ その後の内容,とノードが並びます.

pTeX では,\hbox の直後に和文文字が来た場合,そこでの改行は許されますが,
\insert の直後に和文文字が来た場合,そこでの改行は許されないという挙動になっています.

@h-kitagawa
Copy link
Member

なお,\xkanjiskip の挿入処理については,\insert は単純に無視されるので,今のコミュニティ版のように \footnotemark, \footnote いずれの場合も合印を出力する @makefnmark でのみ対処すれば十分だと思います.

(LuaTeX-ja では,\insert の直後に和文文字が来た場合にも(禁則ペナルティを考慮した上で)改行が可能なので,今回の問題には当たっていないようです.)

@aminophen
Copy link
Member Author

pTeX では,\hbox の直後に和文文字が来た場合,そこでの改行は許されますが,
\insert の直後に和文文字が来た場合,そこでの改行は許されないという挙動になっています.

理解したような気がします。ありがとうございます。(pTeX 難しいです)

@aminophen
Copy link
Member Author

2008 年の(e- でない)pTeX とアスキー版 pLaTeX を調べてみても、やはり合印直後の改行が抑制されていました。これが 2013 年の \xkanjiskip の仕様変更で偶然にも(アキが入る同時に)改行可能になって、それがまたコミュニティ版 pLaTeX で元に戻った、ということのようです。今回の \@footnotetext パッチを入れると状況が改善すると考えられますから、これでよさそうに思います。

aminophen/footnotetext の exppl2e.sty に突っ込みました。しばらくテストしてみます。

@aminophen
Copy link
Member Author

仕様変更の具体的主張がなされておらず,コードのやりとりによって実験が行われている状態に見えます.仕様変更の主張は何かを明記しないと,主張の取り違えや途中からの議論参加の阻害要因になりかねません.

すみません。はっきり書きます。

現行仕様

合印前後のアキなし、合印前後の改行禁止

変更後の仕様案

合印前後のアキなし、合印前の改行禁止、合印後の改行許可

変更後の仕様案を実現する方法

\@footnotetext の末尾に \null を追加する。つまり以下の通り:

\long\def\@footnotetext#1{%
  \ifydir\def\@tempa{\yoko}\else\def\@tempa{\tate}\fi
  \insert\footins{\@tempa%
    \reset@font\footnotesize
    \interlinepenalty\interfootnotelinepenalty
    \splittopskip\footnotesep
    \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
    \hsize\columnwidth \@parboxrestore
    \protected@edef\@currentlabel{%
       \csname p@footnote\endcsname\@thefnmark
    }%
    \color@begingroup
      \@makefntext{%
        \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
    \color@endgroup}\null}

@yuw
Copy link

yuw commented Aug 2, 2016

変更後の仕様案

合印前後のアキなし、合印前の改行禁止、合印後の改行許可

変更後の仕様案の方向性に賛成します.

合印後の改行許可について,例外は想定していますか.あるいはJIS X 4051への準拠を想定していますか.上の議論では句読点が直後にある場合を考察しているようですが.
こういった一見当たり前のように思えることを明確にしていきませんと,仕様として穴があいていきます.

変更後の仕様案を実現する方法

約物直後に\footnoteが置かれた場合に約物直後で改行されるようで,形式的に変更後の仕様案をみたしてはいないようです.

\documentclass{jarticle}

\makeatletter
\long\def\@footnotetext#1{%
  \ifydir\def\@tempa{\yoko}\else\def\@tempa{\tate}\fi
  \insert\footins{\@tempa%
    \reset@font\footnotesize
    \interlinepenalty\interfootnotelinepenalty
    \splittopskip\footnotesep
    \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
    \hsize\columnwidth \@parboxrestore
    \protected@edef\@currentlabel{%
       \csname p@footnote\endcsname\@thefnmark
    }%
    \color@begingroup
      \@makefntext{%
        \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
    \color@endgroup}\null}
\makeatother

\textwidth20zw
\parindent0zw
\begin{document}

1あああああああああああああああああああ\par
2あああああああああああああああああああ)\footnote[1]{いいいいい}うううううううう\par
3あああああああああああああああああああ\footnote[1]{いいいいい}\\うううううううう

\end{document}

どうすればよいかは直ぐには思いつきません.

@h-kitagawa
Copy link
Member

2あああああああああああああああああああ)\footnote[1]{いいいいい}うううううううう\par

「あ」を1つ減らしてみると,閉じ括弧「)」と合印の間に半角空きが入りますね.
jlreq 4.2.3 や,JIS X 4051 を読むと,合印の前の文字と合印の間はベタ組とするようです.
(但し,JIS X 4051 では中点類の後に合印が来た場合のみ四分空き)


また,開き括弧類の直後に \footnotetext をおいた場合,その括弧の直後で
改行可能になってしまいます.

ああああああ(\footnotetext[1]{いいいいい}ううううう

\lastpenalty を使う案を考えつきましたが,朝になってから提示することにします.

@aminophen
Copy link
Member Author

aminophen commented Aug 2, 2016

約物直後に\footnoteが置かれた場合

私が書いた「現行仕様=合印前後のアキなし、合印前後の改行禁止」が、合印前について事実誤認であったようです。もう一度整理しなおします。

現行仕様(というか、現行挙動の調査状況)

合印前後のアキなし(ただし合印直前については、終わり括弧類・句点類の場合は半角アキ、中点類の場合は四分アキ)、合印前後の改行禁止(ただし合印直前については、終わり括弧類・句点類・中点類の場合は可)

変更後の仕様案(理想?)

合印前後のアキなし(合印直前の文字と合印の間はベタ組、ただし中点類の場合は四分アキ?← JIS X 4051)、合印前の改行禁止(完全)、合印後の改行許可(ただし終わり括弧類・句点類・中点類の場合は不可)

追記:上のまとめでは合印後のアキの例外について触れ忘れていました。合印直後が始め括弧類や中点類の場合は、それぞれ現行では半角アキ、四分アキになっています。これは新仕様でも現状維持がよいと思います。また、「合印前」と「合印後」にわけてみてみると、「合印後」については既出の \@footnotetext パッチで完成していると思われます。

@h-kitagawa
Copy link
Member

\lastpenalty を使う案を考えつきましたが,朝になってから提示することにします.

h-kitagawa/platex@f5c907b で入れてみました.
\footnote, \footnotemark については,次のようにしているつもりです.

  • 合印前はベタ,改行禁止.
  • 合印後は改行許可(但し直後の文字に \prebreakpenalty が設定されている場合はそれに反映)
  • 合印後の空白は「通常(文字クラス0の)和字」との間

\footnotetext では,直前にペナルティがあった場合は,そのペナルティを \footnotetext の直後に移動させています.そのため,\footnotetext がない場合に改行が不可能な箇所では,\footnotetext ありでも改行は不可能なはずです.

@aminophen
Copy link
Member Author

h-kitagawa/platex@f5c907b で入れてみました.

ありがとうございます。確かめてみましたが、仕様どおりの実装になっているとおもいます。

@aminophen
Copy link
Member Author

aminophen commented Aug 21, 2016

今回の仕様案とその実装は問題なさそうなのですが(→ すぐ下のコメント:まずい点がありました)、今度は jsclasses の共存について悩んでいます。

1. \footnote と \footnotemark

jsclasses では独自に『和文の句読点・閉じかっこ類の直後で用いた際に余分なアキが入るのを防ぐため,\inhibitglue を入れることにします。』というコードが入っています。

\let\footnotes@ve=\footnote
\def\footnote{\inhibitglue\footnotes@ve}
\let\footnotemarks@ve=\footnotemark
\def\footnotemark{\inhibitglue\footnotemarks@ve}

これとの兼ね合いをどうしましょうか。一つの案として、jsclasses 側に

\@ifl@t@r\pfmtversion{2016/XX/XX}{yes}{no}

を使用して「no の場合にだけ jsclasses がパッチするようにする(yes の場合は新しくなった pLaTeX に一任する)」というのが考えられます。

2. @footnotetext

jsclasses では独自に「脚注で \verb が使えるように改変」というのが入っています。今回「合印直後での改行を許容」の \null を入れようとしているのも、ここと重なってしまいます。そこで、pLaTeX 本体にも「脚注で \verb が使えるように改変」のコードを入れてしまって、jsclasses 側ではやはり \@ifl@t@r 判定を使用する、というのが考えられます。これは挙動変更を伴うわけですが、好ましい方向の変化だとみなせるので許容かな、という感覚です。

3. @makefnmark

これは本件と若干ずれていますが、 texjporg/jsclasses#1 の件で出た \@makefnmark のほうも、jsclasses 側にやはり \@ifl@t@r 判定を入れることを考えています。

@aminophen
Copy link
Member Author

aminophen commented Aug 21, 2016

すぐ上に「実装は問題なさそう」と書いてしまったのですが、今度は exppl2e.sty のコード自体の問題点を見つけてしまいました。

\RequirePackage{exppl2e}
\documentclass[twocolumn]{jarticle}
%%%%% なんらかのパッケージが \footnote の定義を
%%%%% 書き換えた状況を想定:
\makeatletter
\def\footnote{%\inhibitglue\pltx@foot@penalty\z@
     \@ifnextchar[\@xfootnote{\stepcounter\@mpfn
     \protected@xdef\@thefnmark{\thempfn}%
     \@footnotemark\@footnotetext}}
\makeatother
%%%%% これでは \pltx@foot@penalty\z@ を実行しない。
\textwidth42zw
\columnsep2zw
\parindent0zw
\makeatletter
\def\PENALTYINFO{\the\pltx@foot@penalty}
\makeatother
\begin{document}

最初は0で初期化:\PENALTYINFO

ああああああああああああああああああああ(\footnotetext[1]{いいいいい}うううううううう\par

これは10000になるはず:\PENALTYINFO

ああああああああああああああああああああ\footnote{いいいいい}うううううううう\par

これは0でないといけない:\PENALTYINFO

\end{document}

最後の \footnote で不必要に改行が禁止されてしまっています。\pltx@foot@penalty を 0 に初期化する処理をどこに入れるかが問題ですね…

@aminophen
Copy link
Member Author

aminophen commented Aug 22, 2016

\pltx@foot@penalty を 0 に初期化する処理

aminophen/platex@f6521d0 で「\@footnotetext 末尾でペナルティを復旧した直後」に入れ直しました。これなら大丈夫だと思いますがどうでしょう。

追記:

@aminophen
Copy link
Member Author

\footnotetext に \unpenalty を仕込んだことで問題が起きる例を発見しました。lshort.tex (The not so Short Introduction to LaTeX) をコンパイルしてみてエラーが出たのを、最小化したものです。

\documentclass{article}
\begin{document}

\section[Support for Korean]{Support for Korean\footnotemark}\label{support_korean}
\footnotetext{Written by Karnes Kim and Kihwang Lee}

\end{document}
! You can't use `\unpenalty' in vertical mode.
\footnotetext ...@penalty \lastpenalty \unpenalty 
                                                  \@ifnextchar [\@xfootnoten...
l.5 \footnotetext
                 {Written by Karnes Kim and Kihwang Lee}
? 

\footnotetext の定義に \leavevmode を追加すればエラーは起こらなくなるわけですが、入れることによる問題が起きないのかどうかがまたよくわかっていません。

@h-kitagawa
Copy link
Member

h-kitagawa/platex@38b26a8 で,

\ifhmode\pltx@foot@penalty\lastpenalty\unpenalty\fi

と水平モード時のみに \unpenalty を行うようにしてみました.

@aminophen
Copy link
Member Author

よさそうなので merge しました。uplatex も platex に sync してあります。ありがとうございました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants