美文書[第5版] P.103 『6.2 いろいろな記号』に書かれているマクロを利用し,\sqrt の根号を揃えた \ssqrt を定義しました.次のマクロです.
\newcommand{\ssqrt}[1]{\sqrt{\smash[b]{\mathstrut #1}}}
しかし,\ssqrt[2] のように冪根の数字を付けたとき,出力結果がおかしくなります.
この問題への対処をご教授ください.
以下がその例と結果(TeX2imgで作成した画像)です.
%----------------------
%% ドキュメントクラス
\documentclass[uplatex,dvipdfmx,a4paper,papersize,magstyle=real]{bxjsarticle}
\pagestyle{empty}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{mathtools} % include amsmath
%--冪根の数字を修正する(大きくする)--
% https://okumuralab.org/tex/mod/forum/discuss.php?d=1857
\usepackage{etoolbox}
\makeatletter
\patchcmd{\plainroot@}{\scriptscriptstyle}{\scriptstyle}{}{}
\makeatother
% 美文書[第5版] P.103 『6.2 いろいろな記号』に書かれているマクロを利用した
\newcommand{\ssqrt}[1]{\sqrt{\smash[b]{\mathstrut #1}}}
\begin{document}
\begin{align*} % \sqrt …不揃いで美しくない
t&=\sqrt{g}+\sqrt{h} \\
&=\sqrt[2]{g}+\sqrt[2]{h}
\end{align*}
\begin{align*} % \ssqrt …美しくなるハズ
t&=\ssqrt{g}+\ssqrt{h} \\
&=\ssqrt[2]{g}+\ssqrt[2]{h} % アレ
\end{align*}
\end{document}
%----------------------
回答ありがとうございます.
アセト アミノフェン さまの提示された方法で解決いたしました.ありがとうございました.
追記: \sqrt と \sqrt* で従来の根号と美文書の根号を切り替えるマクロを組んでみました.間違っておりましたら指摘してくださると幸いです.
\usepackage{letltxmacro}
\LetLtxMacro{\oldsqrt}{\sqrt}
\makeatletter
\renewcommand{\sqrt}{\@ifstar{\@ifnextchar[{\@oldsqrt}{\@oldsqrt[]}}{\oldsqrt}}
\newcommand{\@oldsqrt}[2][]{\oldsqrt[#1]{\smash[b]{\mathstrut #2}}}
\makeatother
アセト アミノフェン さまの提示された方法で解決いたしました.ありがとうございました.
追記: \sqrt と \sqrt* で従来の根号と美文書の根号を切り替えるマクロを組んでみました.間違っておりましたら指摘してくださると幸いです.
\usepackage{letltxmacro}
\LetLtxMacro{\oldsqrt}{\sqrt}
\makeatletter
\renewcommand{\sqrt}{\@ifstar{\@ifnextchar[{\@oldsqrt}{\@oldsqrt[]}}{\oldsqrt}}
\newcommand{\@oldsqrt}[2][]{\oldsqrt[#1]{\smash[b]{\mathstrut #2}}}
\makeatother
追記の追記:
アセト アミノフェン さまが,よりシンプルな回答に直してくださったようですので,私の追記した \sqrt* もシンプルなマクロに変えてみました.出力は先のものと同じです.
\usepackage{letltxmacro}
\makeatletter
\LetLtxMacro{\oldsqrt}{\sqrt}
\newcommand{\newsqrt}[2][]{\oldsqrt[#1]{\smash[b]{\mathstrut #2}}}
\renewcommand{\sqrt}{\@ifstar{\newsqrt}{\oldsqrt}}
\makeatother
アセト アミノフェン さまが,よりシンプルな回答に直してくださったようですので,私の追記した \sqrt* もシンプルなマクロに変えてみました.出力は先のものと同じです.
\usepackage{letltxmacro}
\makeatletter
\LetLtxMacro{\oldsqrt}{\sqrt}
\newcommand{\newsqrt}[2][]{\oldsqrt[#1]{\smash[b]{\mathstrut #2}}}
\renewcommand{\sqrt}{\@ifstar{\newsqrt}{\oldsqrt}}
\makeatother
ご指摘のように変更すると,不自然だった等号直後の間隔が修正されますね.(言われるまで気がつきませんでした….)
%--最終的にこんな感じになった
\documentclass[uplatex,dvipdfmx,a4paper,papersize,magstyle=real]{bxjsarticle}
\pagestyle{empty}
\usepackage{lmodern}
\usepackage{mathtools} % include amsmath
%--冪根の数字を修正する(大きくする)--
% https://okumuralab.org/tex/mod/forum/discuss.php?d=1857
\usepackage{etoolbox}
\makeatletter
\patchcmd{\plainroot@}{\scriptscriptstyle}{\scriptstyle}{}{}
\makeatother
%--マクロ--
\usepackage{letltxmacro}
\makeatletter
\LetLtxMacro{\oldsqrt}{\sqrt}
\newcommand{\newsqrt}[2][\ ]{\oldsqrt[#1]{\smash[b]{\mathstrut #2}}}
\renewcommand{\sqrt}{\@ifstar{\newsqrt}{\oldsqrt}}
\makeatother
\begin{document}
\begin{align*}
t&=\sqrt{g}+\sqrt{h} \\
&=\sqrt*{g}+\sqrt*{h} \\
t&=\sqrt[2]{g}+\sqrt[2]{h} \\
&=\sqrt*[2]{g}+\sqrt*[2]{h}
\end{align*}
\end{document}
%--最終的にこんな感じになった
\documentclass[uplatex,dvipdfmx,a4paper,papersize,magstyle=real]{bxjsarticle}
\pagestyle{empty}
\usepackage{lmodern}
\usepackage{mathtools} % include amsmath
%--冪根の数字を修正する(大きくする)--
% https://okumuralab.org/tex/mod/forum/discuss.php?d=1857
\usepackage{etoolbox}
\makeatletter
\patchcmd{\plainroot@}{\scriptscriptstyle}{\scriptstyle}{}{}
\makeatother
%--マクロ--
\usepackage{letltxmacro}
\makeatletter
\LetLtxMacro{\oldsqrt}{\sqrt}
\newcommand{\newsqrt}[2][\ ]{\oldsqrt[#1]{\smash[b]{\mathstrut #2}}}
\renewcommand{\sqrt}{\@ifstar{\newsqrt}{\oldsqrt}}
\makeatother
\begin{document}
\begin{align*}
t&=\sqrt{g}+\sqrt{h} \\
&=\sqrt*{g}+\sqrt*{h} \\
t&=\sqrt[2]{g}+\sqrt[2]{h} \\
&=\sqrt*[2]{g}+\sqrt*[2]{h}
\end{align*}
\end{document}
オプション引数に「\ 」をいれないと
詰まるのは,
たぶん,\newcommandが
何か副作用を起こしています.
「\ 」は本来の空きとは違うと思うので
場合によっては何か起こるかもしれません
#添え字になったときとか・・試してないけど
\newcommandの定義は追いかけてませんが
optionがない場合の展開のときに,
mathrel「=」の直後に
数式の要素とみなされうる何かを
置いてるのかなとは思います.
こういうときは,
ブラックボックス的な高レベルな記述より
低レベルな記述の方がみやすいかもしれません.
\def\newsqrt{\@ifnextchar[%]
{\@newsqrt}
{\@@newsqrt}
}
\def\@newsqrt[#1]#2{\oldsqrt[#1]{\smash[b]{\mathstrut #2}}}
\def\@@newsqrt#1{\oldsqrt{\smash[b]{\mathstrut #1}}}
詰まるのは,
たぶん,\newcommandが
何か副作用を起こしています.
「\ 」は本来の空きとは違うと思うので
場合によっては何か起こるかもしれません
#添え字になったときとか・・試してないけど
\newcommandの定義は追いかけてませんが
optionがない場合の展開のときに,
mathrel「=」の直後に
数式の要素とみなされうる何かを
置いてるのかなとは思います.
こういうときは,
ブラックボックス的な高レベルな記述より
低レベルな記述の方がみやすいかもしれません.
\def\newsqrt{\@ifnextchar[%]
{\@newsqrt}
{\@@newsqrt}
}
\def\@newsqrt[#1]#2{\oldsqrt[#1]{\smash[b]{\mathstrut #2}}}
\def\@@newsqrt#1{\oldsqrt{\smash[b]{\mathstrut #1}}}
本田 さま,前田 さま,回答ありがとうございます.
お二方の方法で,羃根の指数がないときの \sqrt および \sqrt* の横の出力位置が揃いました.
TeX言語を使った方法や比較的新しいパッケージを使った方法があり,興味深いです.
%-------------以下,実装例
% TeX言語による操作は怖いので,xparse を利用しました
%% ドキュメントクラス
\documentclass[uplatex,dvipdfmx,a4paper,papersize,magstyle=real]{bxjsarticle}
\pagestyle{empty}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{mathtools} % include amsmath
%--冪根の数字を修正する(大きくする)--
% https://okumuralab.org/tex/mod/forum/discuss.php?d=1857
\usepackage{etoolbox}
\makeatletter
\patchcmd{\plainroot@}{\scriptscriptstyle}{\scriptstyle}{}{}
\makeatother
%--高さの統一した根号 \sqrt* 命令を追加する--
% https://okumuralab.org/tex/mod/forum/discuss.php?d=1864
\usepackage{letltxmacro}
\usepackage{xparse}
\makeatletter
\LetLtxMacro{\oldsqrt}{\sqrt}
\DeclareDocumentCommand{\newsqrt}{o m}{%
\IfValueTF{#1}{\oldsqrt[#1]}{\oldsqrt}{\smash[b]{\mathstrut #2}}%
}
\renewcommand{\sqrt}{%
\@ifstar{\newsqrt}{\oldsqrt}%
}
\makeatother
\begin{document}
\begin{align*}
s&=\sqrt{g}+\sqrt{h} \\
s^\ast &=\sqrt*{g}+\sqrt*{h} \\
s[]&=\sqrt[2]{g}+\sqrt[2]{h} \\
s^\ast[] &=\sqrt*[2]{g}+\sqrt*[2]{h}
\end{align*}
\end{document}
お二方の方法で,羃根の指数がないときの \sqrt および \sqrt* の横の出力位置が揃いました.
TeX言語を使った方法や比較的新しいパッケージを使った方法があり,興味深いです.
%-------------以下,実装例
% TeX言語による操作は怖いので,xparse を利用しました
%% ドキュメントクラス
\documentclass[uplatex,dvipdfmx,a4paper,papersize,magstyle=real]{bxjsarticle}
\pagestyle{empty}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{mathtools} % include amsmath
%--冪根の数字を修正する(大きくする)--
% https://okumuralab.org/tex/mod/forum/discuss.php?d=1857
\usepackage{etoolbox}
\makeatletter
\patchcmd{\plainroot@}{\scriptscriptstyle}{\scriptstyle}{}{}
\makeatother
%--高さの統一した根号 \sqrt* 命令を追加する--
% https://okumuralab.org/tex/mod/forum/discuss.php?d=1864
\usepackage{letltxmacro}
\usepackage{xparse}
\makeatletter
\LetLtxMacro{\oldsqrt}{\sqrt}
\DeclareDocumentCommand{\newsqrt}{o m}{%
\IfValueTF{#1}{\oldsqrt[#1]}{\oldsqrt}{\smash[b]{\mathstrut #2}}%
}
\renewcommand{\sqrt}{%
\@ifstar{\newsqrt}{\oldsqrt}%
}
\makeatother
\begin{document}
\begin{align*}
s&=\sqrt{g}+\sqrt{h} \\
s^\ast &=\sqrt*{g}+\sqrt*{h} \\
s[]&=\sqrt[2]{g}+\sqrt[2]{h} \\
s^\ast[] &=\sqrt*[2]{g}+\sqrt*[2]{h}
\end{align*}
\end{document}