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

\textXX の定義と \everyparhook の入り方 #66

Open
doraTeX opened this issue May 3, 2018 · 7 comments
Open

\textXX の定義と \everyparhook の入り方 #66

doraTeX opened this issue May 3, 2018 · 7 comments

Comments

@doraTeX
Copy link
Member

doraTeX commented May 3, 2018

Twitterで述べた件です。解決は難しそうですが,とりあえずご報告まで。

次のソースを (u)pLaTeX で処理すると,下記のようになります。

\documentclass[autodetect-engine]{jsarticle}
\usepackage[deluxe]{otf}
\def\test{「ほげABC」\par}
\begin{document}
\noindent ■■■■■■■■■\par
\test
\textmc{\test}
\textgt{\test}
\textmg{\test}
\textrm{\test}
\textsf{\test}
\texttt{\test}
\textmd{\test}
\textbf{\test}
\textup{\test}
\textit{\test}
\end{document}

image

jsclassesは \textmc, \textgt の定義からイタリック補正を外すよう再定義している影響で,\textmc, \textgt については \everyparhook の直前に挿入され,結果的に期待通りの出力となります。ですが,普通の \textXX は実装の先頭で \hmode@bgroup(= \leavevmode\bgroup)が実行されるため,段落先頭が \bgroup だと判断され,それゆえに \everyparhook の挿入位置が の直前にならず,JFMグルーが消されないようです。

@aminophen
Copy link
Member

たしか,\everyparhook で「直後のトークンが開きカッコ類かを判定する」という処理をしている理由が,単に「\inhibitglue がどこまでもリセットされないバグ/仕様」回避だったと思います。現在の pTeX はこの問題がないので,判定を外すとどうなるんでしょう?

@doraTeX
Copy link
Member Author

doraTeX commented May 3, 2018

段落冒頭が中黒の場合に \inhibitglue を効かせたくない,という事情もあります。

@aminophen
Copy link
Member

段落冒頭が中黒の場合に \inhibitglue を効かせたくない

中黒の時はグルーが残った方が良いのでしょうか? いまいち理由がよくわかりません。

@doraTeX
Copy link
Member Author

doraTeX commented May 14, 2018

中黒の時はグルーが残った方が良いのでしょうか? いまいち理由がよくわかりません。

自分の経験上,(その善し悪しは別にして)段落冒頭が中黒というのは,

・ほげ
・ふが

のような短い語句の簡易的な箇条書きに使われるケースが大半です。このようなケースにおいては,上下の段落の和文文字とグリッド状に並ぶことが期待されており,ここが .25zw だけ左にずれて前後の行とのグリッドが崩れることを嫌うユーザは一定数いそうです。

まあ,本来箇条書きならば itemize なりを使うべきだし,\noindent ・ほげ としたらどっちにせよグルーは入らないのだから,気にしなくてもいいのかもしれませんが……。特に縦組のときの itemize はデフォルトの \textbullet が中央からずれていて使いにくいため,皆さん綺麗に全角正方形の中央に収まる中黒を使いたがるのですよね。

中黒以外に,全角コロン,全角セミコロンのあたりにも影響しますね。

@aminophen
Copy link
Member

そういえば,「JIS メトリック系」には jis{,-v} だけでなく jisn{,-v} というのもあって,両者の違いは

中黒・コロン・セミコロンが「半角幅+前後グルー」か「全角幅」か

のようです(ほとんど無名だと思いますが)。

「\textrm などでグルーが消えない」と「中黒を箇条書きに使う人の組版結果が変わる」

のどちらが大きな問題なのかという点に帰着しますが,個人的には前者派です。後者の人が困らないようにするには,「jisn を使うためのオプションを新設する」という代替案がありえます。

@doraTeX
Copy link
Member Author

doraTeX commented May 14, 2018

確かに,思い切って \everypar{\inhigitglue} としてしまえば本件の問題は解決しますね。「段落冒頭中点類の組版結果が変わる」以外に影響がないなら,メリットデメリットを天秤にかければ,こうしてしまうのもありかもしれません。

@aminophen
Copy link
Member

jsclasses の \text 系命令の件,改めて検討したく。

冒頭の @doraTeX さんの報告のとおり,段落頭に \text 系命令を使った場合に

  • 和文用 \textmc \textgt etc. は始めかっこ類の時だけ JFM グルーを消す
  • 欧文用 \textrm \textsf \texttt etc. は常に JFM グルーが残る

という挙動になっています。これは jsclasses の実装が

  • \everypar に \everyparhook を挿入する
    • \everyparhook は直後のトークンが始めかっこ類かどうかを判定する … (★)
  • \textmc, \textgt を再定義してイタリック補正を外す
    • → \everyparhook の直後のトークンが(通常は)文字になり,(★)で判定可能
  • \textrm, \textsf, \texttt の定義は変更しない
    • → \everyparhook の直後のトークンが \hmode@bgroup (\bgroup) になり,(★)が常に偽

となっているためです。ここで,(★)の判定を行っている理由は

であると考えられます。前者の問題は既に修正されていますから,後者が問題です。

さて,私が既にコメントで述べているとおり,「JIS メトリック系」には jis{,-v} だけでなく jisn{,-v} というのもあって,両者の違いは

中黒・コロン・セミコロンが「半角幅+前後グルー」か「全角幅」か

です。そこで,この jisn{,-v} を活用し,デフォルトの挙動は維持しつつ

  • 新オプション(またはパッケージ)で「jisn メトリックに切り替える機能」を提供する
    • この機能が有効のときは \everyparhook は単に \inhibitglue とする

という実装案を実行に移してみたいです。なお,課題は

  • pLaTeX では jisn が使えるが,upLaTeX ではどうするか?

です。いかがでしょうか?

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

2 participants