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

\@ の互換性 #62

Open
zr-tex8r opened this issue Nov 12, 2017 · 4 comments
Open

\@ の互換性 #62

zr-tex8r opened this issue Nov 12, 2017 · 4 comments

Comments

@zr-tex8r
Copy link
Contributor

jsclasses では \@ の仕様を次のように変更しています:

  1. TV.\@␣ のように書く。これだと’V’と’.’の間のカーニングが生きる。
  2. LaTeX標準の通り TV\@.␣ と書いてもよい。これだとカーニングは(従来通り)無効。

これに応じて実装を次のように変更しています:

% 1000ではなく3000にする
\def\@{\spacefactor3000{}}

この実装だと\@の直後に空白トークンが続いた場合の出力が(当然)標準の場合と異なることになります。恐らく「ユーザ(文書作成者)は絶対にこんな列は書かない」ので問題が無いと判断されたのでしょう。

しかし実際には「特殊な単語やロゴを出力する命令」の実装において、その単語が英大文字で終わる場合に、防御的に\@を入れるという使い方が行われています。

% LaTeX標準のTeXロゴの定義
\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@}

従って、実際には(出力レベルで)「\@の直後に空白トークン」は起こりえて、実際に標準の場合と異なる出力になります。

\documentclass[a4paper]{jsarticle}
\begin{document}
\framebox[10em][s]{TeX \TeX{} duck}
\end{document}

image-textexduck

@aminophen
Copy link
Member

この互換性は私も気になっていて,以前こんなことを考えたことがありました。

例えば pp. 46--48 のような列では,既定では pp. の後の空白が文末空白として扱われてしまいます。普通の LaTeX の定義であれば 実はこれを妨げるために \@ を使うことができて,

\documentclass{article}
\begin{document}

% pp. の後は文末空白として扱われてしまう
See the next few pages (pp. 44--46).

% pp. の後を単語間空白にしたい
See the next few pages (pp.\@ 44--46).

\end{document}

のように機能させることができます。source2e.pdf を見る限りこのような使い方は想定外でしょうけど,実用上はこれが便利なので,実際に使っている人がいそうだ,と勝手に思っていました。(もちろん jsclasses では 1000 ではなく 3000 にしてあるため,このような使い方は封じられている。)パッケージ等でそのような使い方をしているケースは知りません。

@zr-tex8r
Copy link
Contributor Author

\spacefactor1000の代わりに\@と書く」、さすがに文書中で使うのはバッドな感じがしますが、パッケージの実装で使うのはアリな気がしますねえ……。

@zr-tex8r
Copy link
Contributor Author

zr-tex8r commented Nov 23, 2017

ちなみに、「防御的な\@」の方については、BXjsclsでは
「現在のspace factorが1000未満なら1000、それ以外は3000にする」
(↑なんだかspace factorみたいだ😃)
という対策を考えていました。

 \chardef\bxjs@periodchar=`\.
-\bxjs@protected\def\bxjs@SE{\spacefactor\sfcode\bxjs@periodchar}
+\bxjs@protected\def\bxjs@SE{%
+  \ifnum\spacefactor<\m@ \spacefactor\m@
+  \else \spacefactor\sfcode\bxjs@periodchar
+  \fi}
 \def\@{\bxjs@SE{}}

※この対策をする場合、\@の本体を保護付にする必要がある。(無論\@自体を保護付にするのはダメゼッタイ。)

先述の「目的外の\@」については……、少なくともBXjsclsだったら「再定義を抑止するオプションを設ける」で逃げることになりそうです。jsclassesがそれでいいかは微妙なところですが。

@aminophen
Copy link
Member

aminophen commented Dec 13, 2017

\spacefactor1000の代わりに\@と書く」、さすがに文書中で使うのはバッドな感じがしますが、パッケージの実装で使うのはアリな気がしますねえ……。

探してみると

に付いている回答は,本当に \@ を「目的外」に使っていますね。「目的外の\@」をパッケージが使う可能性は十分ありそうです。(もちろん jsclasses の下では破綻している。)まあ,

の回答者は,目的外の用法が回答に登場することについてよく思っていないようですが。

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