范畴论中的双向规则环境

范畴论中的双向规则环境

我想排版一些涉及伴随的范畴论计算(有时称为双向规则)。

简而言之,它们看起来大约像这样(MWE):

\documentclass[a4paper]{article}
\usepackage{amsmath}

\begin{document}
\begin{align*}
C &\longrightarrow FD\\
\line(1,0){75}&\line(1,0){75}\\
GC &\longrightarrow D\\
\line(1,0){75}&\line(1,0){75}\\
1 &\longrightarrow D^{GC}
\end{align*}
\end{document}

在此处输入图片描述

当然,这看起来很可怕,但它应该能传达出大致的想法。

我想要一个环境(叫做adjunctions),它允许我输入上述内容,例如:

\begin{adjunctions}
C & FD \\
GC & D \\
1 & D^{GC}
\end{adjunctions}

我需要几样东西:

  • 一个设置线条宽度的选项(在整个环境中是通用的),也许可以使它们不对称(即左边比右边长);
  • 适当的间距;在上面的例子中,它GC \to D和上方线条之间的间距就是我想要的,包括顶部和底部边距;
  • 可选地,控制符号的放置位置\longrightarrow(在整个环境中通用就可以了)。

我在网上搜索过,但什么也没找到(甚至连一张排版正确的图片都没有)。对于创建自定义align环境的一般参考也非常感谢。

答案1

这能满足您的需要吗?

\documentclass{article}
\usepackage{array,xparse}

\usepackage{multicol} % just for the example
\setlength{\columnseprule}{.4pt} % just for the example

\ExplSyntaxOn
\NewDocumentEnvironment{adjunctions}{O{}}
 {
  \cs_set_eq:cN {@arraycr} \farin_arraycr:
  \keys_set:nn { farin/adjunction } { #1 }
  \begin{array}
   {
    @{ \hspace { \dim_eval:n { \l_farin_left_shift_dim + \l_farin_padding_dim } } }
    r
    @{ {\farin_strut:} \l_farin_symbol_tl {} }
    l
    @{ \hspace { \dim_eval:n { \l_farin_right_shift_dim + \l_farin_padding_dim } } }
   }
 }
 {
  \end{array}
 }
\keys_define:nn { farin/adjunction }
 {
  leftshift       .dim_set:N = \l_farin_left_shift_dim,
  leftshift       .initial:n = 0pt,
  rightshift      .dim_set:N = \l_farin_right_shift_dim,
  rightshift      .initial:n = 0pt,
  padding         .dim_set:N = \l_farin_padding_dim,
  padding         .initial:n = 6pt,
  symbol          .tl_set:N  = \l_farin_symbol_tl,
  symbol          .initial:n = \longrightarrow,
  verticalspacing .dim_set:N  = \l_farin_vertspac_dim,
  verticalspacing .initial:n = {3pt},
 }
\cs_new_protected:Npn \farin_strut:
 {
  \vrule height \dim_eval:n { \ht\strutbox + 1.2\l_farin_vertspac_dim }
         depth  \dim_eval:n { \dp\strutbox + \l_farin_vertspac_dim }
         width 0pt
 }
\makeatletter
\exp_args:NNo \cs_new:Npn \farin_arraycr:
 {
  \@arraycr\hline
 }
\makeatother
\ExplSyntaxOff
\begin{document}
\begin{multicols}{2}
\noindent
\verb|\begin{adjunctions}|
\[
\begin{adjunctions}
C & FD \\
GC & D \\
1 & D^{GC}
\end{adjunctions}
\]
\verb|\begin{adjunctions}|\\
\verb|  [symbol=\longleftarrow]|
\[
\begin{adjunctions}[symbol=\longleftarrow]
C & FD \\
GC & D \\
1 & D^{GC}
\end{adjunctions}
\]
\verb|\begin{adjunctions}|\\
\verb|  [leftshift=12pt]|
\[
\begin{adjunctions}[leftshift=12pt]
C & FD \\
GC & D \\
1 & D^{GC}
\end{adjunctions}
\]
\verb|\begin{adjunctions}|\\
\verb|  [rightshift=12pt,|\\
\verb|   symbol=\otimes]|
\[
\begin{adjunctions}[rightshift=12pt,symbol=\otimes]
C & FD \\
GC & D \\
1 & D^{GC}
\end{adjunctions}
\]
\verb|\begin{adjunctions}|\\
\verb|  [verticalspacing=2ex]|
\[
\begin{adjunctions}[verticalspacing=2ex]
C & FD \\
GC & D \\
1 & D^{GC}
\end{adjunctions}
\]
\end{multicols}
\end{document}

在此处输入图片描述

答案2

普通的 TeX 解决方案也应该可以在 LaTeX 中使用。

\def\adjunctions
    {\bgroup
     \def\\%
        {\crcr 
         \noalign{\vskip 0.2\baselineskip \hrule \vskip 0.2\baselineskip}}%
     \halign \bgroup 
     \hss \mathsurround0pt $\displaystyle ## \longrightarrow {}$%
     &
     \mathsurround0pt $\displaystyle ##$ \cr}

\def\endadjunctions{\crcr\egroup}

\adjunctions
  C  & FD \\
  GC & D \\
  1  & D^{GC}
\endadjunctions

\bye

在此处输入图片描述

相关内容