如何将两个框与周围框的右上和左上对齐?

如何将两个框与周围框的右上和左上对齐?

假设以下结构(从另一个文档自动生成),我应该如何定义\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}

棺材系列

相关内容