みなさま、はじめて投稿させていただきます。
使用しているパッケージはamsmath、amssymbを使っています。
a^{2^3}、b_{2_3}、int_2^3 など^_を使用して添字を表していますが、この中で
a^{2^3}、b_{2_3}の指数の位置を調整することはできるのでしょうか。
個別に\raseboxなどで対応するのはかなり手間なので、デフォルトの発生位置を変更したいと考えております。
a\hogesup{2}などのマクロも避けたい思います。
^_の挙動を変えるのはかなり難しいとは思いますが、ご存じか方いないでしょうか。
もしくは有能なパッケージの紹介でもありがたいです。
よろしくお願いします。
数式中の添え字の高さは、数式フォントが持っている fontdimen パラメータの値をもとに算出されます。
例えば次のようにすると変化する事が分かると思います。
どのパラメータがどのように使われるかなど、詳しくは『TeXブック』の Appendix G に載っています。
残念ながら絶版らしいのですが、大学図書館などにはあると思います。
\documentclass{article}
\nofiles
\begin{document}
\def\testtext{a^{2^3}\ b_{2_3}\ \int_2^3}
$\testtext$
\fontdimen13\textfont2=6pt
\fontdimen14\textfont2=6pt
\fontdimen15\textfont2=6pt
\fontdimen16\textfont2=6pt
\fontdimen17\textfont2=6pt
$\testtext$
\end{document}
例えば次のようにすると変化する事が分かると思います。
どのパラメータがどのように使われるかなど、詳しくは『TeXブック』の Appendix G に載っています。
残念ながら絶版らしいのですが、大学図書館などにはあると思います。
\documentclass{article}
\nofiles
\begin{document}
\def\testtext{a^{2^3}\ b_{2_3}\ \int_2^3}
$\testtext$
\fontdimen13\textfont2=6pt
\fontdimen14\textfont2=6pt
\fontdimen15\textfont2=6pt
\fontdimen16\textfont2=6pt
\fontdimen17\textfont2=6pt
$\testtext$
\end{document}
https://ctan.org/tex-archive/systems/knuth/dist/tex
TeX Bookの日本語版は入手困難ですが,コンパイルはできませんけども
上にある「texbook.tex」は読めます.
24761行目からAppendix Gです.rule 18からが添え字の処理ですが,
難行苦行です.
fontdimen13から17,細かいこと言えばさらにfontdimen18と19までが必要で,
TeX Bookでは「\sigma_{17}」のように表記されています.
(LaTeXの範囲では \DeclareFontShapeの最後の引数で\fontdimenに触れますが,
\fontdimenへの代入は常に\globalだったような)
個人的には \fontdimen をいじるなら
まずは _ や ^ を再定義して対症療法でなんとかなるか考えるかもしれません.
\documentclass{article}
\usepackage{lmodern}
\begin{document}\Huge
\bgroup
\catcode`\^=\active
\catcode`\_=\active
\gdef\activeSupSub{%
\catcode`\^=\active
\catcode`\_=\active
\def^##1{\textbf{SUP##1}}
\def_##1{\texttt{sub##1}}
}
\egroup
$a^1_2$
\begin{activeSupSub}
$a^1_{2^{50}_1}$
\end{activeSupSub}
\end{document}
こんな感じで,^ と _ に悪戯することはできます.
おまけ:
LuaTeXだったら fontdimen に相当するパラメータがあるようです。
TeX Bookの日本語版は入手困難ですが,コンパイルはできませんけども
上にある「texbook.tex」は読めます.
24761行目からAppendix Gです.rule 18からが添え字の処理ですが,
難行苦行です.
fontdimen13から17,細かいこと言えばさらにfontdimen18と19までが必要で,
TeX Bookでは「\sigma_{17}」のように表記されています.
(LaTeXの範囲では \DeclareFontShapeの最後の引数で\fontdimenに触れますが,
\fontdimenへの代入は常に\globalだったような)
個人的には \fontdimen をいじるなら
まずは _ や ^ を再定義して対症療法でなんとかなるか考えるかもしれません.
\documentclass{article}
\usepackage{lmodern}
\begin{document}\Huge
\bgroup
\catcode`\^=\active
\catcode`\_=\active
\gdef\activeSupSub{%
\catcode`\^=\active
\catcode`\_=\active
\def^##1{\textbf{SUP##1}}
\def_##1{\texttt{sub##1}}
}
\egroup
$a^1_2$
\begin{activeSupSub}
$a^1_{2^{50}_1}$
\end{activeSupSub}
\end{document}
こんな感じで,^ と _ に悪戯することはできます.
おまけ:
LuaTeXだったら fontdimen に相当するパラメータがあるようです。
私の回答では fontdimen の変更をお示ししましたが、実は、本田さんの回答にあるような、「^」と「_」をアクティブ文字にする方法が現実的だと思っていました。ところが、
> これだと入力工数が増えるのでちょっと現実的ではない
との返信でいささか面喰っています。
ひょっとして、数式が出てくるたびに逐一 activeSupSub 環境の開始と終了を記述しなければいけないと考えてしまったのでしょうか?
実際にはその必要はなく、文書全体を一括して activeSupSub 環境にしてしまえばよいので、入力工数は問題にはならないのではないかと思います。もっと省力化するなら、次のサンプルにあるように \AtBeginDocument に環境開始を仕込んでしまったりすることもできますし、プリアンブルで設定を有効にしてしまってそもそも環境を切り替える必要をなくしてしまうこともできます。
下のサンプルでは、本田さんの方法をベースにして、添え字の中の添え字を独立して変更する方法も試してみました。limitsやnolimitsの場合にどうなるかはちょっとわかりませんが。
\documentclass{article}
%\usepackage{lmodern}
\bgroup
\catcode`\^=\active
\catcode`\_=\active
\gdef\activeSupSub{%
\catcode`\^=\active
\catcode`\_=\active
\def^{\mysup}
\def_{\mysub}
}
\gdef\endactiveSupSub{}
\egroup
\def\mysup#1{^{\nearrow\let\mysup\mysupsup\let\mysub\mysupsub#1}}
\def\mysub#1{_{\searrow\let\mysup\mysubsup\let\mysub\mysubsub#1}}
\def\mysupsup#1{^{\Uparrow(#1)}}
\def\mysupsub#1{_{\Downarrow(#1)}}
\def\mysubsup#1{^{\Uparrow(#1)}}
\def\mysubsub#1{_{\Downarrow(#1)}}
\AtBeginDocument{\activeSupSub}
\AtEndDocument{\endactiveSupSub}
\begin{document}\Huge
$a^1_2$
$a^1_{2^{50}_1}$
\end{document}
> これだと入力工数が増えるのでちょっと現実的ではない
との返信でいささか面喰っています。
ひょっとして、数式が出てくるたびに逐一 activeSupSub 環境の開始と終了を記述しなければいけないと考えてしまったのでしょうか?
実際にはその必要はなく、文書全体を一括して activeSupSub 環境にしてしまえばよいので、入力工数は問題にはならないのではないかと思います。もっと省力化するなら、次のサンプルにあるように \AtBeginDocument に環境開始を仕込んでしまったりすることもできますし、プリアンブルで設定を有効にしてしまってそもそも環境を切り替える必要をなくしてしまうこともできます。
下のサンプルでは、本田さんの方法をベースにして、添え字の中の添え字を独立して変更する方法も試してみました。limitsやnolimitsの場合にどうなるかはちょっとわかりませんが。
\documentclass{article}
%\usepackage{lmodern}
\bgroup
\catcode`\^=\active
\catcode`\_=\active
\gdef\activeSupSub{%
\catcode`\^=\active
\catcode`\_=\active
\def^{\mysup}
\def_{\mysub}
}
\gdef\endactiveSupSub{}
\egroup
\def\mysup#1{^{\nearrow\let\mysup\mysupsup\let\mysub\mysupsub#1}}
\def\mysub#1{_{\searrow\let\mysup\mysubsup\let\mysub\mysubsub#1}}
\def\mysupsup#1{^{\Uparrow(#1)}}
\def\mysupsub#1{_{\Downarrow(#1)}}
\def\mysubsup#1{^{\Uparrow(#1)}}
\def\mysubsub#1{_{\Downarrow(#1)}}
\AtBeginDocument{\activeSupSub}
\AtEndDocument{\endactiveSupSub}
\begin{document}\Huge
$a^1_2$
$a^1_{2^{50}_1}$
\end{document}
北見さん
>との返信でいささか面喰っています。
いつも,フォローありがとうございます.
単に,「通常」「通常ではない」を並べるためだけに環境にしただけだったので,
正直なところ面喰いました.
#そのときには「bm」の件もアップされていたので余計に.
\nolimits/\limits関係は,本来の意味での ^ や _ (もしくは等価な \sp や \sb)が
それらの直後の最初の空白以外のトークンになるようにすれば
amsの\textとか組み合わせてなんとかなりそうな気はします.
圧縮スタイルまでは再現できないように思いますが(すべて未実験).
北川さん:
newtxとTUG Boatの記事の情報ありがとうございます.
両方とも知りませんでした.
romannumeralのアレ,expl3と展開のアレ,今回のAppendix Gのアレと
TUG Boatで年末年始かな(笑)
>との返信でいささか面喰っています。
いつも,フォローありがとうございます.
単に,「通常」「通常ではない」を並べるためだけに環境にしただけだったので,
正直なところ面喰いました.
#そのときには「bm」の件もアップされていたので余計に.
\nolimits/\limits関係は,本来の意味での ^ や _ (もしくは等価な \sp や \sb)が
それらの直後の最初の空白以外のトークンになるようにすれば
amsの\textとか組み合わせてなんとかなりそうな気はします.
圧縮スタイルまでは再現できないように思いますが(すべて未実験).
北川さん:
newtxとTUG Boatの記事の情報ありがとうございます.
両方とも知りませんでした.
romannumeralのアレ,expl3と展開のアレ,今回のAppendix Gのアレと
TUG Boatで年末年始かな(笑)
北見様
ありがとうございます。
北見様の推察通り、数式が出てくる度に環境の開始と終了をしなければならないのかと思いました。
プリアンブルで\AtBeginDocument{\activeSupSub}と\AtEndDocument{\endactiveSupSub}で文書全体に仕込めるということなのですね。
\AtBeginDocumentと\AtEndDocumentを使わないようにできないものかとも思い、他にも\catcodeを使って改変しているのがあるので、それになぞって下記のようにしてみたところ、エラーはでませんが期待の動作はしませんでした。
\catcodeを使って変更するやりかたは、見よう見まねでやっているので正直理解が追いついていないのです。
\let\normalsup=^ % 元の^の動作を保存
\begingroup
\catcode`\^=\active
\lccode`~=`^ %
\lowercase{\endgroup
\def~#1}{\normalsup{\raise2ex\hbox{\let\mysup\mysupsup\let\mysub\mysupsub$\scriptstyle{#1}$}}}
\let\normalsub=_ % 元の_の動作を保存
\begingroup
\catcode`\_=\active
\lccode`~=`_ %
\lowercase{\endgroup
\def~#1}{\normalsub{\lower.5ex\hbox{\let\mysup\mysubsup\let\mysub\mysubsub$\scriptstyle{#1}$}}}
\def\mysupsup#1{\normalsup{#1}}
\def\mysupsub#1{\normalsub{#1}}
\def\mysubsup#1{\normalsup{#1}}
\def\mysubsub#1{\normalsub{#1}}
ありがとうございます。
北見様の推察通り、数式が出てくる度に環境の開始と終了をしなければならないのかと思いました。
プリアンブルで\AtBeginDocument{\activeSupSub}と\AtEndDocument{\endactiveSupSub}で文書全体に仕込めるということなのですね。
\AtBeginDocumentと\AtEndDocumentを使わないようにできないものかとも思い、他にも\catcodeを使って改変しているのがあるので、それになぞって下記のようにしてみたところ、エラーはでませんが期待の動作はしませんでした。
\catcodeを使って変更するやりかたは、見よう見まねでやっているので正直理解が追いついていないのです。
\let\normalsup=^ % 元の^の動作を保存
\begingroup
\catcode`\^=\active
\lccode`~=`^ %
\lowercase{\endgroup
\def~#1}{\normalsup{\raise2ex\hbox{\let\mysup\mysupsup\let\mysub\mysupsub$\scriptstyle{#1}$}}}
\let\normalsub=_ % 元の_の動作を保存
\begingroup
\catcode`\_=\active
\lccode`~=`_ %
\lowercase{\endgroup
\def~#1}{\normalsub{\lower.5ex\hbox{\let\mysup\mysubsup\let\mysub\mysubsub$\scriptstyle{#1}$}}}
\def\mysupsup#1{\normalsup{#1}}
\def\mysupsub#1{\normalsub{#1}}
\def\mysubsup#1{\normalsup{#1}}
\def\mysubsub#1{\normalsub{#1}}
> エラーはでませんが期待の動作はしませんでした。
お示しのコードだけでは試してみることができません。\documentclass から \end{document} まで揃っていてそのまま動かせるようになっているサンプルをつけていただけると、どのように意図と違っているのかが確認できます。
とりあえず、こちらで適当に補ったものでは変更が効くように思えます。いかがでしょうか。
\documentclass{article}
\let\normalsup=^ % 元の^の動作を保存
\begingroup
\catcode`\^=\active
\lccode`~=`^ %
\lowercase{\endgroup
\def~#1}{\normalsup{\raise2ex\hbox{\let\mysup\mysupsup\let\mysub\mysupsub$\scriptstyle{#1}$}}}
\let\normalsub=_ % 元の_の動作を保存
\begingroup
\catcode`\_=\active
\lccode`~=`_ %
\lowercase{\endgroup
\def~#1}{\normalsub{\lower1.5ex\hbox{\let\mysup\mysubsup\let\mysub\mysubsub$\scriptstyle{#1}$}}}
\def\mysupsup#1{\normalsup{#1}}
\def\mysupsub#1{\normalsub{#1}}
\def\mysubsup#1{\normalsup{#1}}
\def\mysubsub#1{\normalsub{#1}}
\begin{document}%\Huge
$a^1_2$ $a^1_{2^{50}_1}$
\catcode`\^=\active
\catcode`\_=\active
$a^1_2$ $a^1_{2^{50}_1}$
\end{document}
お示しのコードだけでは試してみることができません。\documentclass から \end{document} まで揃っていてそのまま動かせるようになっているサンプルをつけていただけると、どのように意図と違っているのかが確認できます。
とりあえず、こちらで適当に補ったものでは変更が効くように思えます。いかがでしょうか。
\documentclass{article}
\let\normalsup=^ % 元の^の動作を保存
\begingroup
\catcode`\^=\active
\lccode`~=`^ %
\lowercase{\endgroup
\def~#1}{\normalsup{\raise2ex\hbox{\let\mysup\mysupsup\let\mysub\mysupsub$\scriptstyle{#1}$}}}
\let\normalsub=_ % 元の_の動作を保存
\begingroup
\catcode`\_=\active
\lccode`~=`_ %
\lowercase{\endgroup
\def~#1}{\normalsub{\lower1.5ex\hbox{\let\mysup\mysubsup\let\mysub\mysubsub$\scriptstyle{#1}$}}}
\def\mysupsup#1{\normalsup{#1}}
\def\mysupsub#1{\normalsub{#1}}
\def\mysubsup#1{\normalsup{#1}}
\def\mysubsub#1{\normalsub{#1}}
\begin{document}%\Huge
$a^1_2$ $a^1_{2^{50}_1}$
\catcode`\^=\active
\catcode`\_=\active
$a^1_2$ $a^1_{2^{50}_1}$
\end{document}
北見様
ありがとうございました。またサンプルの提示方法のご指摘ありがとうございます。
下記の方法で希望の動作まではできました。
\intや\sumのlimitsやnolimitsへの影響がでないようにするには私の技量では見当がつきませんでした。
なんとかなるのでしょうか。
\documentclass[dvipdfmx]{jsarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\begingroup
\catcode`\^=\active
\lccode`~=`^ %
\lowercase{\endgroup
\def~}{\mysup}
\catcode`\^=\active
\begingroup
\catcode`\_=\active
\lccode`~=`_ %
\lowercase{\endgroup
\def~}{\mysub}
\catcode`\_=\active
\def\mysup#1{\sp{\raise1ex\hbox{\let\mysup\mysupsup\let\mysub\mysupsub$\scriptstyle{#1}$}}}
\def\mysub#1{\sb{\lower1ex\hbox{\let\mysup\mysubsup\let\mysub\mysubsub$\scriptstyle{#1}$}}}
\def\mysupsup#1{\sp{\scriptscriptstyle#1}}
\def\mysupsub#1{\sb{\scriptscriptstyle#1}}
\def\mysubsup#1{\sp{\scriptscriptstyle#1}}
\def\mysubsub#1{\sb{\scriptscriptstyle#1}}
\begin{document}
$a123\scriptstyle{a123}\scriptscriptstyle{a123}$\\
$a\sp1\sb2$\ $a\sp{1\sp{2\sp3}}$\\
$a^1_2$\ $a^{1^{2^3}}$
$a^1_{2^{50}_1}$\ $a^{1^{60}_3}_{2^{50}_1}$
$\int_a^b$\ $\displaystyle\int_a^b$
$\sum_a^b$\ $\displaystyle\sum_a^b$
\end{document}
ありがとうございました。またサンプルの提示方法のご指摘ありがとうございます。
下記の方法で希望の動作まではできました。
\intや\sumのlimitsやnolimitsへの影響がでないようにするには私の技量では見当がつきませんでした。
なんとかなるのでしょうか。
\documentclass[dvipdfmx]{jsarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\begingroup
\catcode`\^=\active
\lccode`~=`^ %
\lowercase{\endgroup
\def~}{\mysup}
\catcode`\^=\active
\begingroup
\catcode`\_=\active
\lccode`~=`_ %
\lowercase{\endgroup
\def~}{\mysub}
\catcode`\_=\active
\def\mysup#1{\sp{\raise1ex\hbox{\let\mysup\mysupsup\let\mysub\mysupsub$\scriptstyle{#1}$}}}
\def\mysub#1{\sb{\lower1ex\hbox{\let\mysup\mysubsup\let\mysub\mysubsub$\scriptstyle{#1}$}}}
\def\mysupsup#1{\sp{\scriptscriptstyle#1}}
\def\mysupsub#1{\sb{\scriptscriptstyle#1}}
\def\mysubsup#1{\sp{\scriptscriptstyle#1}}
\def\mysubsub#1{\sb{\scriptscriptstyle#1}}
\begin{document}
$a123\scriptstyle{a123}\scriptscriptstyle{a123}$\\
$a\sp1\sb2$\ $a\sp{1\sp{2\sp3}}$\\
$a^1_2$\ $a^{1^{2^3}}$
$a^1_{2^{50}_1}$\ $a^{1^{60}_3}_{2^{50}_1}$
$\int_a^b$\ $\displaystyle\int_a^b$
$\sum_a^b$\ $\displaystyle\sum_a^b$
\end{document}
手を抜いている部分がありますが,
こんな感じでしょうか.
ちなみに手を抜いているところは空白トークンの扱いですが,
これは面倒なので放置です.
#空白トークンを読み飛ばす \futurelet って既存のものがありそうですが,
#なんか思い浮かばない・・・ありますよね,きっと.
あえて北川さんのアドバイスにあるnewtxのコードは読まずに
対症療法的に積み上げてみます.
なお老婆心ながら,
この用途ならあえてlowercaseのトリックでグループ終了を飛び越えなくても
globalの方が楽だと思います.
\documentclass[dvipdfmx]{jsarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\makeatletter
\begingroup
\catcode`\^=\active
\lccode`~=`^ %
\lowercase{\endgroup
\def~}{\mysup}
\catcode`\^=\active
\begingroup
\catcode`\_=\active
\lccode`~=`_ %
\lowercase{\endgroup
\def~}{\mysub}
\catcode`\_=\active
\newdimen\shift@suffix
\shift@suffix1ex
\def\reset@ornot@shift@suffix@sb{%
\ifx\@next_\else\global\shift@suffix1ex\fi
}
\def\reset@ornot@shift@suffix@sp{%
\ifx\@next^\else\global\shift@suffix1ex\fi
}
\def\mysup#1{\sp{\text{\raise\shift@suffix\hbox{\let\mysup\mysupsup\let\mysub\mysupsub$#1$}}}%
\futurelet\@next\reset@ornot@shift@suffix@sb
}
\def\mysub#1{\sb{\text{\lower\shift@suffix\hbox{\let\mysup\mysubsup\let\mysub\mysubsub$#1$}}}%
\futurelet\@next\reset@ornot@shift@suffix@sp
}
\def\mysupsup#1{\sp{\text{$#1$}}}
\def\mysupsub#1{\sb{\text{$#1$}}}
\def\mysubsup#1{\sp{\text{$#1$}}}
\def\mysubsub#1{\sb{\text{$#1$}}}
\def\int{\intop\shift@suffix\z@\nolimits}
\DeclareMathSymbol{\Sum}{\mathop}{largesymbols}{"50}
\def\sum{\Sum\shift@suffix\z@\displaylimits}
\makeatother
\begin{document}
$a123\scriptstyle{a123}\scriptscriptstyle{a123}$\\
$a\sp1\sb2$\ $a\sp{1\sp{2\sp3}}$\\
$a^1_2$\ $a^{1^{2^3}}$
$a^1_{2^{50}_1}$\ $a^{1^{60}_3}_{2^{50}_1}$
$\int_a^b$\ $\displaystyle\int_a^b$
$\int\sb{a}\sp{b}$\ $\displaystyle\int\sb{a}\sp{b}$
$\sum_a^b$\ $\displaystyle\sum_a^b$
$\sum\sb{a}\sp{b}$\ $\displaystyle\sum\sb{a}\sp{b}$
$a^1_{2^{50}_1}$\ $a^{1^{60}_3}_{2^{50}_1}$
$a\sp1\sb{2\sp{50}\sb1}$\ $a\sp{1\sp{60}\sb3}\sb{2\sp{50}\sb1}$
\end{document}
こんな感じでしょうか.
ちなみに手を抜いているところは空白トークンの扱いですが,
これは面倒なので放置です.
#空白トークンを読み飛ばす \futurelet って既存のものがありそうですが,
#なんか思い浮かばない・・・ありますよね,きっと.
あえて北川さんのアドバイスにあるnewtxのコードは読まずに
対症療法的に積み上げてみます.
なお老婆心ながら,
この用途ならあえてlowercaseのトリックでグループ終了を飛び越えなくても
globalの方が楽だと思います.
\documentclass[dvipdfmx]{jsarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\makeatletter
\begingroup
\catcode`\^=\active
\lccode`~=`^ %
\lowercase{\endgroup
\def~}{\mysup}
\catcode`\^=\active
\begingroup
\catcode`\_=\active
\lccode`~=`_ %
\lowercase{\endgroup
\def~}{\mysub}
\catcode`\_=\active
\newdimen\shift@suffix
\shift@suffix1ex
\def\reset@ornot@shift@suffix@sb{%
\ifx\@next_\else\global\shift@suffix1ex\fi
}
\def\reset@ornot@shift@suffix@sp{%
\ifx\@next^\else\global\shift@suffix1ex\fi
}
\def\mysup#1{\sp{\text{\raise\shift@suffix\hbox{\let\mysup\mysupsup\let\mysub\mysupsub$#1$}}}%
\futurelet\@next\reset@ornot@shift@suffix@sb
}
\def\mysub#1{\sb{\text{\lower\shift@suffix\hbox{\let\mysup\mysubsup\let\mysub\mysubsub$#1$}}}%
\futurelet\@next\reset@ornot@shift@suffix@sp
}
\def\mysupsup#1{\sp{\text{$#1$}}}
\def\mysupsub#1{\sb{\text{$#1$}}}
\def\mysubsup#1{\sp{\text{$#1$}}}
\def\mysubsub#1{\sb{\text{$#1$}}}
\def\int{\intop\shift@suffix\z@\nolimits}
\DeclareMathSymbol{\Sum}{\mathop}{largesymbols}{"50}
\def\sum{\Sum\shift@suffix\z@\displaylimits}
\makeatother
\begin{document}
$a123\scriptstyle{a123}\scriptscriptstyle{a123}$\\
$a\sp1\sb2$\ $a\sp{1\sp{2\sp3}}$\\
$a^1_2$\ $a^{1^{2^3}}$
$a^1_{2^{50}_1}$\ $a^{1^{60}_3}_{2^{50}_1}$
$\int_a^b$\ $\displaystyle\int_a^b$
$\int\sb{a}\sp{b}$\ $\displaystyle\int\sb{a}\sp{b}$
$\sum_a^b$\ $\displaystyle\sum_a^b$
$\sum\sb{a}\sp{b}$\ $\displaystyle\sum\sb{a}\sp{b}$
$a^1_{2^{50}_1}$\ $a^{1^{60}_3}_{2^{50}_1}$
$a\sp1\sb{2\sp{50}\sb1}$\ $a\sp{1\sp{60}\sb3}\sb{2\sp{50}\sb1}$
\end{document}
本田様 ありがとうございます。
私にはかなり高度で頭が追いついておりません^^;
> なお老婆心ながら,
> この用途ならあえてlowercaseのトリックでグループ終了を飛び越えなくても
> globalの方が楽だと思います.
正解かわかりませんが
\begingroup
\catcode`^=\active
\catcode`_=\active
\gdef^{\mysup}
\gdef_{\mysub}
\endgroup
\catcode`\^=\active
\catcode`_=\active
このようにしました。
おしえていただいたサンプルは上付と下付が同じ数値で移動するので、それぞれで設定したく下記のように少し改変しましたが、インテグラルやシグマの箇所まで影響がでてしまいました。
私の頭では判定している箇所の判定(\ifx\@nextだと思うのですが)が正しく理解できていないからだと思います。もちろん\futureletも理解が追いついておりません。
どのように修正すればよろしいでしょうか?
> ちなみに手を抜いているところは空白トークンの扱いですが,
> これは面倒なので放置です.
空白のトークンの扱いとはどのような事なのでしょうか?
いただいたサンプルはプレアンブル内に\makeatletter、\makeatotherが入っておりました。再定義するマクロなどに@が現れる場合に使用するのだと思いますが、どの部分が再定義になっているのでしょうか?知識の浅い私には新しく定義しているものばかりに見えます。。。
\documentclass[dvipdfmx]{jsarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\makeatletter
\begingroup
\catcode`^=\active
\catcode`_=\active
\gdef^{\mysup}
\gdef_{\mysub}
\endgroup
\catcode`\^=\active
\catcode`_=\active
\newdimen\shift@suffix
\shift@suffix1ex
%下記を追加
\newdimen\shift@suffix@sp
\shift@suffix@sp1ex
\newdimen\shift@suffix@sb
\shift@suffix@sb2ex
%ここまで
\def\reset@ornot@shift@suffix@sb{%
\ifx\@next_\else\global\shift@suffix1ex\fi
}
\def\reset@ornot@shift@suffix@sp{%
\ifx\@next^\else\global\shift@suffix1ex\fi
}
%\raise\shift@suffixから\raise\shift@suffix@spに変更
\def\mysup#1{\sp{\text{\raise\shift@suffix@sp\hbox{\let\mysup\mysupsup\let\mysub\mysupsub$#1$}}}%
\futurelet\@next\reset@ornot@shift@suffix@sb
}
%\lower\shift@suffixから\lower\shift@suffix@sbに変更
\def\mysub#1{\sb{\text{\lower\shift@suffix@sb\hbox{\let\mysup\mysubsup\let\mysub\mysubsub$#1$}}}%
\futurelet\@next\reset@ornot@shift@suffix@sp
}
\def\mysupsup#1{\sp{\text{$#1$}}}
\def\mysupsub#1{\sb{\text{$#1$}}}
\def\mysubsup#1{\sp{\text{$#1$}}}
\def\mysubsub#1{\sb{\text{$#1$}}}
\def\int{\intop\shift@suffix\z@\nolimits}
\DeclareMathSymbol{\Sum}{\mathop}{largesymbols}{"50}
\def\sum{\Sum\shift@suffix\z@\displaylimits}
\makeatother
\begin{document}
\parindent=0pt
文字の大きさ
$a123\scriptstyle{a123}\scriptscriptstyle{a123}$\\
デフォルトの位置
$a\sp1\sb2$\ $a\sp{1\sp{2\sp3}}$\\
ここから \\
$a^1$\ $a_2$\ $a^1_2$\\\\
$a^{1^{2^3}}$\ $a_{1_{2_3}}$\ $a^{1^{2^3}}_{1_{2_3}}$\\\\
$a^1_{2^{50}_1}$\ $a^{1^{60}_3}_{2^{50}_1}$\\
spsbを使用
$\int\sb{a}\sp{b}$\ $\displaystyle\int\sb{a}\sp{b}$\\
$\int_a^b$\ $\displaystyle\int_a^b$\\
spsbを使用
$\sum\sb{a}\sp{b}$\ $\displaystyle\sum\sb{a}\sp{b}$\\
$\sum_a^b$\ $\displaystyle\sum_a^b$\\
spsbを使用
$a\sp1\sb{2\sp{50}\sb1}$\ $a\sp{1\sp{60}\sb3}\sb{2\sp{50}\sb1}$\\
$a^1_{2^{50}_1}$\ $a^{1^{60}_3}_{2^{50}_1}$\\
その他\\
$a\_\text{\textasciicircum}$a\_\textasciicircum\ $f'(x)$
\end{document}
私にはかなり高度で頭が追いついておりません^^;
> なお老婆心ながら,
> この用途ならあえてlowercaseのトリックでグループ終了を飛び越えなくても
> globalの方が楽だと思います.
正解かわかりませんが
\begingroup
\catcode`^=\active
\catcode`_=\active
\gdef^{\mysup}
\gdef_{\mysub}
\endgroup
\catcode`\^=\active
\catcode`_=\active
このようにしました。
おしえていただいたサンプルは上付と下付が同じ数値で移動するので、それぞれで設定したく下記のように少し改変しましたが、インテグラルやシグマの箇所まで影響がでてしまいました。
私の頭では判定している箇所の判定(\ifx\@nextだと思うのですが)が正しく理解できていないからだと思います。もちろん\futureletも理解が追いついておりません。
どのように修正すればよろしいでしょうか?
> ちなみに手を抜いているところは空白トークンの扱いですが,
> これは面倒なので放置です.
空白のトークンの扱いとはどのような事なのでしょうか?
いただいたサンプルはプレアンブル内に\makeatletter、\makeatotherが入っておりました。再定義するマクロなどに@が現れる場合に使用するのだと思いますが、どの部分が再定義になっているのでしょうか?知識の浅い私には新しく定義しているものばかりに見えます。。。
\documentclass[dvipdfmx]{jsarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\makeatletter
\begingroup
\catcode`^=\active
\catcode`_=\active
\gdef^{\mysup}
\gdef_{\mysub}
\endgroup
\catcode`\^=\active
\catcode`_=\active
\newdimen\shift@suffix
\shift@suffix1ex
%下記を追加
\newdimen\shift@suffix@sp
\shift@suffix@sp1ex
\newdimen\shift@suffix@sb
\shift@suffix@sb2ex
%ここまで
\def\reset@ornot@shift@suffix@sb{%
\ifx\@next_\else\global\shift@suffix1ex\fi
}
\def\reset@ornot@shift@suffix@sp{%
\ifx\@next^\else\global\shift@suffix1ex\fi
}
%\raise\shift@suffixから\raise\shift@suffix@spに変更
\def\mysup#1{\sp{\text{\raise\shift@suffix@sp\hbox{\let\mysup\mysupsup\let\mysub\mysupsub$#1$}}}%
\futurelet\@next\reset@ornot@shift@suffix@sb
}
%\lower\shift@suffixから\lower\shift@suffix@sbに変更
\def\mysub#1{\sb{\text{\lower\shift@suffix@sb\hbox{\let\mysup\mysubsup\let\mysub\mysubsub$#1$}}}%
\futurelet\@next\reset@ornot@shift@suffix@sp
}
\def\mysupsup#1{\sp{\text{$#1$}}}
\def\mysupsub#1{\sb{\text{$#1$}}}
\def\mysubsup#1{\sp{\text{$#1$}}}
\def\mysubsub#1{\sb{\text{$#1$}}}
\def\int{\intop\shift@suffix\z@\nolimits}
\DeclareMathSymbol{\Sum}{\mathop}{largesymbols}{"50}
\def\sum{\Sum\shift@suffix\z@\displaylimits}
\makeatother
\begin{document}
\parindent=0pt
文字の大きさ
$a123\scriptstyle{a123}\scriptscriptstyle{a123}$\\
デフォルトの位置
$a\sp1\sb2$\ $a\sp{1\sp{2\sp3}}$\\
ここから \\
$a^1$\ $a_2$\ $a^1_2$\\\\
$a^{1^{2^3}}$\ $a_{1_{2_3}}$\ $a^{1^{2^3}}_{1_{2_3}}$\\\\
$a^1_{2^{50}_1}$\ $a^{1^{60}_3}_{2^{50}_1}$\\
spsbを使用
$\int\sb{a}\sp{b}$\ $\displaystyle\int\sb{a}\sp{b}$\\
$\int_a^b$\ $\displaystyle\int_a^b$\\
spsbを使用
$\sum\sb{a}\sp{b}$\ $\displaystyle\sum\sb{a}\sp{b}$\\
$\sum_a^b$\ $\displaystyle\sum_a^b$\\
spsbを使用
$a\sp1\sb{2\sp{50}\sb1}$\ $a\sp{1\sp{60}\sb3}\sb{2\sp{50}\sb1}$\\
$a^1_{2^{50}_1}$\ $a^{1^{60}_3}_{2^{50}_1}$\\
その他\\
$a\_\text{\textasciicircum}$a\_\textasciicircum\ $f'(x)$
\end{document}
\makeatletter/\makeatotherに関しては
プリアンブルに「@」を含むコントロールシーケンスを書くためのおまじないというくらいの認識で構いません.
その実装はカテゴリコードの細工ですが普通はその実装そのものはスルーしても問題ないです
空白のトークンに関しては
今話題にしている _ と ^ の(私がでっちあげた \futurelet つき)変種が有効になっている範囲において
$\sum_{a}^{b}$ と $\sum_{a} ^{b}$
を比較すれば,何を言っているかはわかると思います.
後者において _{a} と ^{b} の間にある「空白」が問題です.
この問題への対処をしていないということです.
上下への移動量を別にするのは
移動量がどう作用しているのかを追いかければわかると思います.
ひとまず「全部盛り」のコードを載せてみますが,
けっこう厄介になります(もうちょっと整理できそうですが).
上述の「空白の処理」がTeXの黒魔術の入り口みたいなコードで,
latex.ltxの \@ifnextchar の定義のパクリです.
上下の移動量の分離は,TeXに限らずよくあるパターンだと思います.
1exという具体的な値を変数にいれて,
あとはその変数で記述する手法です.
defaultという名前がよくないというか,
実際はもう一段階深く変数にする方がいい感じもしますが,
ややこしくなるので止めます.
#不具合は残ってるかもしれません
\documentclass[dvipdfmx]{jsarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\makeatletter
\begingroup
\catcode`\^=\active
\gdef^{\mysup}
\catcode`\_=\active
\gdef_{\mysub}
\endgroup
\catcode`\^=\active
\catcode`\_=\active
\def\default@shift@sub{1ex}
\def\default@shift@sup{1ex}
\newdimen\shift@sub\shift@sub=\default@shift@sub\relax
\newdimen\shift@sup\shift@sup=\default@shift@sup\relax
\def\:{\@rest@sb@gobblesp}
\expandafter\def\: {\futurelet\@next\reset@ornot@shift@suffix@sb}
\def\reset@ornot@shift@suffix@sb{%<br /> \ifx\@next\@sptoken<br /> \let\temp@reset@sb\@rest@sb@gobblesp<br /> \else<br /> \ifx\@next_%<br /> \def\temp@reset@sb{}%
\else
\def\temp@reset@sb{\shift@sub\default@shift@sub\relax<br /> \shift@sup\default@shift@sup\relax}%
\fi
\fi
\temp@reset@sb
}
\def\:{\@rest@sp@gobblesp}
\expandafter\def\: {\futurelet\@next\reset@ornot@shift@suffix@sp}
\def\reset@ornot@shift@suffix@sp{%<br /> \ifx\@next\@sptoken<br /> \let\temp@reset@sp\@rest@sp@gobblesp<br /> \else<br /> \ifx\@next^%<br /> \def\temp@reset@sp{}%
\else
\def\temp@reset@sp{\shift@sub\default@shift@sub\relax<br /> \shift@sup\default@shift@sup\relax}%
\fi
\fi
\temp@reset@sp
}
\def\mysup#1{\sp{\text{\raise\shift@sup\hbox{\let\mysup\mysupsup\let\mysub\mysupsub$#1$}}}%
\futurelet\@next\reset@ornot@shift@suffix@sb
}
\def\mysub#1{\sb{\text{\lower\shift@sub\hbox{\let\mysup\mysubsup\let\mysub\mysubsub$#1$}}}%
\futurelet\@next\reset@ornot@shift@suffix@sp
}
\def\mysupsup#1{\sp{\text{$#1$}}}
\def\mysupsub#1{\sb{\text{$#1$}}}
\def\mysubsup#1{\sp{\text{$#1$}}}
\def\mysubsub#1{\sb{\text{$#1$}}}
\def\int{\intop\shift@sub\z@\shift@sup\z@\nolimits}
\DeclareMathSymbol{\Sum}{\mathop}{largesymbols}{"50}
\def\sum{\Sum\shift@sub\z@\shift@sup\z@\displaylimits}
\makeatother
\begin{document}
$a123\scriptstyle{a123}\scriptscriptstyle{a123}$\\
$a\sp1\sb2$\ $a\sp{1\sp{2\sp3}}$\\
$a^1_2$\ $a^{1^{2^3}}$
$a^1_{2^{50}_1}$\ $a^{1^{60}_3}_{2^{50}_1}$
$\int_a^b$\ $\displaystyle\int_a^b$
$\int\sb{a}\sp{b}$\ $\displaystyle\int\sb{a}\sp{b}$
$\sum_a^b$\ $\sum_a ^b$
$\sum^a_b$\ $\sum^a _b$
$$
\sum_a^b\ \sum_a ^b
\sum^a_b\ \sum^a _b
$$
$\sum\sb{a}\sp{b}$\ $\displaystyle\sum\sb{a}\sp{b}$
$a^1_{2^{50}_1}$\ $a^{1^{60}_3}_{2^{50}_1}$
$a\sp1\sb{2\sp{50}\sb1}$\ $a\sp{1\sp{60}\sb3}\sb{2\sp{50}\sb1}$
\end{document}
プリアンブルに「@」を含むコントロールシーケンスを書くためのおまじないというくらいの認識で構いません.
その実装はカテゴリコードの細工ですが普通はその実装そのものはスルーしても問題ないです
空白のトークンに関しては
今話題にしている _ と ^ の(私がでっちあげた \futurelet つき)変種が有効になっている範囲において
$\sum_{a}^{b}$ と $\sum_{a} ^{b}$
を比較すれば,何を言っているかはわかると思います.
後者において _{a} と ^{b} の間にある「空白」が問題です.
この問題への対処をしていないということです.
上下への移動量を別にするのは
移動量がどう作用しているのかを追いかければわかると思います.
ひとまず「全部盛り」のコードを載せてみますが,
けっこう厄介になります(もうちょっと整理できそうですが).
上述の「空白の処理」がTeXの黒魔術の入り口みたいなコードで,
latex.ltxの \@ifnextchar の定義のパクリです.
上下の移動量の分離は,TeXに限らずよくあるパターンだと思います.
1exという具体的な値を変数にいれて,
あとはその変数で記述する手法です.
defaultという名前がよくないというか,
実際はもう一段階深く変数にする方がいい感じもしますが,
ややこしくなるので止めます.
#不具合は残ってるかもしれません
\documentclass[dvipdfmx]{jsarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\makeatletter
\begingroup
\catcode`\^=\active
\gdef^{\mysup}
\catcode`\_=\active
\gdef_{\mysub}
\endgroup
\catcode`\^=\active
\catcode`\_=\active
\def\default@shift@sub{1ex}
\def\default@shift@sup{1ex}
\newdimen\shift@sub\shift@sub=\default@shift@sub\relax
\newdimen\shift@sup\shift@sup=\default@shift@sup\relax
\def\:{\@rest@sb@gobblesp}
\expandafter\def\: {\futurelet\@next\reset@ornot@shift@suffix@sb}
\def\reset@ornot@shift@suffix@sb{%<br /> \ifx\@next\@sptoken<br /> \let\temp@reset@sb\@rest@sb@gobblesp<br /> \else<br /> \ifx\@next_%<br /> \def\temp@reset@sb{}%
\else
\def\temp@reset@sb{\shift@sub\default@shift@sub\relax<br /> \shift@sup\default@shift@sup\relax}%
\fi
\fi
\temp@reset@sb
}
\def\:{\@rest@sp@gobblesp}
\expandafter\def\: {\futurelet\@next\reset@ornot@shift@suffix@sp}
\def\reset@ornot@shift@suffix@sp{%<br /> \ifx\@next\@sptoken<br /> \let\temp@reset@sp\@rest@sp@gobblesp<br /> \else<br /> \ifx\@next^%<br /> \def\temp@reset@sp{}%
\else
\def\temp@reset@sp{\shift@sub\default@shift@sub\relax<br /> \shift@sup\default@shift@sup\relax}%
\fi
\fi
\temp@reset@sp
}
\def\mysup#1{\sp{\text{\raise\shift@sup\hbox{\let\mysup\mysupsup\let\mysub\mysupsub$#1$}}}%
\futurelet\@next\reset@ornot@shift@suffix@sb
}
\def\mysub#1{\sb{\text{\lower\shift@sub\hbox{\let\mysup\mysubsup\let\mysub\mysubsub$#1$}}}%
\futurelet\@next\reset@ornot@shift@suffix@sp
}
\def\mysupsup#1{\sp{\text{$#1$}}}
\def\mysupsub#1{\sb{\text{$#1$}}}
\def\mysubsup#1{\sp{\text{$#1$}}}
\def\mysubsub#1{\sb{\text{$#1$}}}
\def\int{\intop\shift@sub\z@\shift@sup\z@\nolimits}
\DeclareMathSymbol{\Sum}{\mathop}{largesymbols}{"50}
\def\sum{\Sum\shift@sub\z@\shift@sup\z@\displaylimits}
\makeatother
\begin{document}
$a123\scriptstyle{a123}\scriptscriptstyle{a123}$\\
$a\sp1\sb2$\ $a\sp{1\sp{2\sp3}}$\\
$a^1_2$\ $a^{1^{2^3}}$
$a^1_{2^{50}_1}$\ $a^{1^{60}_3}_{2^{50}_1}$
$\int_a^b$\ $\displaystyle\int_a^b$
$\int\sb{a}\sp{b}$\ $\displaystyle\int\sb{a}\sp{b}$
$\sum_a^b$\ $\sum_a ^b$
$\sum^a_b$\ $\sum^a _b$
$$
\sum_a^b\ \sum_a ^b
\sum^a_b\ \sum^a _b
$$
$\sum\sb{a}\sp{b}$\ $\displaystyle\sum\sb{a}\sp{b}$
$a^1_{2^{50}_1}$\ $a^{1^{60}_3}_{2^{50}_1}$
$a\sp1\sb{2\sp{50}\sb1}$\ $a\sp{1\sp{60}\sb3}\sb{2\sp{50}\sb1}$
\end{document}