假设以下结构(从另一个文档自动生成),我应该如何定义\csup
并使\csub
盒子sup
与相邻盒子的顶部对齐,并使sub
盒子与底部对齐?
\documentclass{article}
\newcommand*{\csup}[1]{\scriptsize{#1}}
\newcommand*{\csub}[1]{\scriptsize{#1}}
\newcommand*{\cnotation}[1]{#1}
\newcommand*{\crepeat}[1]{\fbox{#1}}
\newcommand*{\cwrapper}[1]{#1}
\begin{document}
\cwrapper{\crepeat{%
AAA
\cwrapper{\crepeat{%
BBB
\cwrapper{\crepeat{CCC}\csup{pC}\csub{bC}}}
\csup{pB}\csub{bB}}}
\csup{pA}\csub{bA}}
\end{document}
换句话说,我该如何更改文档以生成以下内容:
而不是这样?
我尝试了 raisebox 和 adjustbox,但是以下是我能得到的最好的结果:
\newcommand*{\csup}[1]{\adjustbox{valign=t}{\scriptsize{\rlap{#1}}}}
\newcommand*{\csub}[1]{\adjustbox{valign=b}{\scriptsize{#1}}}
答案1
(简化答案,一次性显示两种候选解决方法)
这里有两个候选解决方案。第一个将下标和上标项相对于紧接在前的框的右边缘定位,而第二个则忽略紧接在前的框的高度。
相对于您的代码,主要的变化是(a)\cwrapper
采用三个参数(#1:要放置在盒子中的材料;#2 和#3:上标和下标项)和(b)使用数学模式来帮助定位上标和下标项相对于前面的材料。
\documentclass{article}
\newcommand*{\cscr}[1]{\textnormal{\scriptsize #1}}
\newcommand*{\cwrappera}[3]{%
$\left.{\textnormal{\fbox{#1}}}\ \right.^{\cscr{#2}}_{\cscr{#3}}$}
\newcommand*{\cwrapperb}[3]{%
\fbox{#1} ${\vphantom{\textnormal{#1}}}^{\cscr{#2}}_{\cscr{#3}}$}
\begin{document}
\cwrappera{AAA
\cwrappera{BBB
\cwrappera{CCC}{pC}{bC}}
{pB}{bB}}
{pA}{bA}
\medskip
\cwrapperb{AAA
\cwrapperb{BBB
\cwrapperb{CCC}{pC}{bC}}
{pB}{bB}}
{pA}{bA}
\end{document}
答案2
OP 的原始语法可以通过以下表述来保留:
\documentclass{article}
\usepackage{amsmath}
\newcommand*{\csub}[1]{_\textnormal{~#1}}
\newcommand*{\csup}[1]{^\textnormal{~#1}}
\newcommand*{\cnotation}[1]{#1}
\newcommand*{\crepeat}[1]{\fbox{#1}}
\newcommand*{\cwrapper}[1]{\ensuremath{#1}}
\begin{document}
\cwrapper{\crepeat{%
AAA
\cwrapper{\crepeat{%
BBB
\cwrapper{\crepeat{CCC}\csup{pC}\csub{bC}}}
\csup{pB}\csub{bB}}}
\csup{pA}\csub{bA}}
\end{document}
我使用\cwrapper
确保数学模式,然后使用\csub
和\csup
使用带有\text
宏的数学子标和上标。
如果希望下标和上标更紧密,那么可以这样做,我将下标向上移动 1pt,将上标向下移动 2.5pt:
\documentclass{article}
\usepackage{amsmath}
\newcommand*{\csub}[1]{_\textnormal{~#1}}
\newcommand*{\csup}[1]{^\textnormal{~#1}}
\newcommand*{\cnotation}[1]{#1}
\newcommand*{\crepeat}[1]{\setbox0=\hbox{\fbox{#1}}\ht0=\dimexpr\ht0-2.5pt\relax%
\dp0=\dimexpr\dp0-1pt\relax\box0}
\newcommand*{\cwrapper}[1]{\ensuremath{#1}}
\begin{document}
\cwrapper{\crepeat{%
AAA
\cwrapper{\crepeat{%
BBB
\cwrapper{\crepeat{CCC}\csup{pC}\csub{bC}}}
\csup{pB}\csub{bB}}}
\csup{pA}\csub{bA}}
\end{document}
答案3
这是一个尊重您想要的笨拙语法的版本。
\documentclass{article}
\makeatletter
\newcommand{\cwrapper}[1]{%
\leavevmode\check@mathfonts
\begingroup\ignorespaces
#1%
\clement@wrap
\endgroup
}
\newcommand{\crepeat}[1]{%
\def\clement@repeat{#1}\ignorespaces
}
\newcommand{\csup}[1]{\def\clement@sup{#1}\ignorespaces}
\newcommand{\csub}[1]{\def\clement@sub{#1}\ignorespaces}
\newcommand{\clement@wrap}{%
\sbox\z@{\fbox{\clement@repeat}}%
\copy\z@
\raisebox{-\dp\z@}{%
\vbox to \dimexpr\ht\z@+\dp\z@{
\hrule height\z@
\hbox{\fontsize\sf@size\z@\selectfont\clement@sup}
\vss
\hbox{\fontsize\sf@size\z@\selectfont\clement@sub}
\hrule height\z@
}%
}%
}
\makeatother
\begin{document}
\cwrapper{\crepeat{AAA}\csup{a}\csub{b}}
\cwrapper{\crepeat{%
AAA
\cwrapper{\crepeat{%
BBB
\cwrapper{\crepeat{CCC}\csup{pC}\csub{bC}}}
\csup{pB}\csub{bB}}}
\csup{pA}\csub{bA}}
\Large
\cwrapper{\crepeat{AAA}\csup{a}\csub{b}}
\end{document}
请注意,字体大小的变化也会被尊重。
答案4
正因为它在那里,这里有一个使用棺材来排列和排版盒子的版本。
语法与问题中指定的语法相同,只是\cwrapper
可以采用可选参数来指定较大框与上标和下标之间的水平距离。由于这是可选的,因此可以不加改变地使用 OP 的语法。在这种情况下,默认值为1pt
,但显然可以根据需要进行修改。
本质上,和中的每一个\csup
都被定义为将其内容放入棺材中。被定义为适当地连接棺材并排版结果。 嵌套按预期工作,如下面的扩展示例所示。\csub
\crepeat
\cwrapper
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\coffin_new:N \l_clement_main_coffin
\coffin_new:N \l_clement_tmpa_coffin
\coffin_new:N \l_clement_sup_coffin
\coffin_new:N \l_clement_sub_coffin
\dim_new:N \l_clement_spacer_dim
\NewDocumentCommand \csup { m }
{
\hcoffin_set:Nn \l_clement_sup_coffin { \scriptsize #1 }
}
\NewDocumentCommand \csub { m }
{
\hcoffin_set:Nn \l_clement_sub_coffin { \scriptsize #1 }
}
\NewDocumentCommand \crepeat { m }
{
\hcoffin_set:Nn \l_clement_tmpa_coffin { \fbox { \tl_trim_spaces:n { #1 } } }
}
\NewDocumentCommand \cwrapper { O { 1pt } m }
{
\group_begin:
\clement_cwrapper:nn { #1 } { #2 }
\group_end:
}
\cs_generate_variant:Nn \coffin_join:NnnNnnnn { NnnNnnVn }
\cs_new_protected:Npn \clement_cwrapper:nn #1 #2
{
#2
\dim_set:Nn \l_clement_spacer_dim { #1 }
\coffin_join:NnnNnnVn \l_clement_tmpa_coffin { r } { t } \l_clement_sup_coffin { l } { t } \l_clement_spacer_dim { 0pt }
\coffin_join:NnnNnnVn \l_clement_tmpa_coffin { \l_clement_tmpa_coffin-r } { \l_clement_tmpa_coffin-b } \l_clement_sub_coffin { l } { b } \l_clement_spacer_dim { 0pt }
\coffin_set_eq:NN \l_clement_main_coffin \l_clement_tmpa_coffin
\coffin_typeset:Nnnnn \l_clement_main_coffin { l } { H } { 0pt } { 0pt }
}
\ExplSyntaxOff
\begin{document}
\cwrapper{\crepeat{%
AAA
}%
\csup{pA}\csub{bA}%
}
\cwrapper{\crepeat{%
AAA
\cwrapper{\crepeat{%
BBB
}%
\csup{pB}\csub{bB}%
}%
}%
\csup{pA}\csub{bA}%
}
\cwrapper{\crepeat{%
AAA
\cwrapper{\crepeat{%
BBB
\cwrapper{\crepeat{CCC}\csup{pC}\csub{bC}%
}%
}%
\csup{pB}\csub{bB}%
}%
}%
\csup{pA}\csub{bA}%
}
\cwrapper[5pt]{\crepeat{%
AAA
\cwrapper{\crepeat{%
BBB
\cwrapper[10pt]{\crepeat{CCC}\csup{pC}\csub{bC}%
}%
}%
}%
}%
\csup{pA}\csub{bA}%
}
\cwrapper{\crepeat{%
AAA
\cwrapper{\crepeat{%
BBB
\cwrapper{\crepeat{CCC}\csup{pC}%
}%
}%
\csub{bB}%
}%
}%
}
\end{document}