找回密码
 快速注册
搜索
查看: 507|回复: 5

case 套 case

[复制链接]

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2021-8-19 01:02 |阅读模式
QQ截图20210819000739.png

在 LaTeX 中,常规方法输入得到左边,本帖要将它变成右边。

N 年前的这帖 kuing.cjhb.site/forum.php?mod=viewthread&tid=332 利用 \smash 弄过最简单的情形,但当年并没说清楚一个细节,如果用 \boxed 给当年那个公式加个框:

$\boxed{
\left.\begin{aligned}
\smash{\left.\begin{aligned}
a\perp\alpha\\
l\subset\alpha
\end{aligned}\right\}}
\Rightarrow a\perp l\\
a\sslash b
\end{aligned}\right\}
\Rightarrow b\perp l
}$

所以如果这个公式上面还有东西,就有可能产生重叠。

因此像开头那种复杂的多层嵌套的情形,仅用 \smash 是不够的,不仅会和外面的东西重叠,连里面也会。要解决它得想办法在外面补回应有的高度或深度,为此我鼓捣了两天才搞出下面的方法,过程及原理这里不细讲了,直接看代码吧。

导言区:
  1. \documentclass{article}
  2. \usepackage{mathtools}
  3. \newcommand\smt[1]{\smash[t]{#1}}
  4. \newcommand\smb[1]{\smash[b]{#1}}
  5. \newsavebox\Obox\newsavebox\Bbox\newsavebox\Tbox
  6. \newsavebox\outbox
  7. \newcommand\kkkkk[1]{%
  8. \sbox\Obox{$
  9. \renewcommand\smt[1]{##1}
  10. \renewcommand\smb[1]{##1}
  11. \displaystyle#1$}%
  12. \sbox\Bbox{$
  13. \renewcommand\smt[1]{##1}
  14. \renewcommand\smb[1]{\smash[b]{##1}}
  15. \displaystyle#1$}%
  16. \sbox\Tbox{$
  17. \renewcommand\smt[1]{\smash[t]{##1}}
  18. \renewcommand\smb[1]{##1}
  19. \displaystyle#1$}%
  20. \sbox\outbox{%
  21. \vphantom{\raise\dimexpr
  22. \dp\Obox-\dp\Tbox-\ht\Obox+\ht\Bbox
  23. \relax\box\Obox}%
  24. \renewcommand\smt[1]{\smash[t]{##1}}%
  25. \renewcommand\smb[1]{\smash[b]{##1}}%
  26. $\displaystyle#1$}%
  27. \box\outbox
  28. }
  29. \newcommand\case[1]{{}\begin{dcases}\relax#1\end{dcases}}
  30. \newcommand\caseo[1]{\kkkkk{\case{#1}}}      %补全距,用于外层及中间
  31. \newcommand\caset[1]{\smt{\kkkkk{\case{#1}}}}%去高度,用于顶上的
  32. \newcommand\caseb[1]{\smb{\kkkkk{\case{#1}}}}%去深度,用于底下的
  33. \newcommand\casetz[1]{\smt{\case{#1}}}       %最后一层专用(为节约资源)
  34. \newcommand\casebz[1]{\smb{\case{#1}}}       %最后一层专用(为节约资源)
复制代码
注:这里用 mathtools 宏包只是为了用它的 dcases 环境(比 cases 好),此外该包自动加载 amsmath。

正文用法:
最简单的两层:
  1. \fbox{%
  2. \caseo{
  3. k\casetz{k\\kk}\\
  4. kkk\casebz{k\\kk\\kkk\\kkkk}
  5. }%
  6. }
复制代码
注:套一层 \fbox 只为看看边界有没有问题,非必要,后面的 \boxed 也是。
效果:
QQ截图20210819005718.png

三层兼放入公式中:
  1. \[\boxed{
  2. \sum f=
  3. \caseo{
  4. f\caset{
  5.   k\casetz{k\\kk}\\
  6.   kkk\casebz{k\\kk\\kkk\\kkkk}
  7.   }
  8. \\
  9. ff\caseo{
  10.   k\casetz{k\\kk\\kkk}\\
  11.   kk\casebz{k\\kk}
  12.   }
  13. \\
  14. fff\caseb{
  15.    k\casetz{k\\kk\\kkk}\\
  16.    kk\casebz{k\\kk\\kkk\\kkkk}
  17.    }
  18. }
  19. =\int k
  20. }\]
复制代码
这个例子演示了:最外层及中间用 o ,顶上用 t ,底下用 b ,最后一层节约资源用带 z 的版本。
效果:
QQ截图20210819010201.png

至于开头那个数系的图,要打中文当然需要先将导言区第一行改成比如:
  1. \documentclass[UTF8]{ctexart}
  2. \xeCJKsetup{CJKmath=true}
复制代码
这里 CJKmath=true 是允许在公式里直接输入中文,省回打 \text。
然后正文:
  1. 复数%
  2. \caseo{
  3. 实数\caset{
  4.     有理数\caset{
  5.         整数\casetz{自然数\\负整数}\\
  6.         分数\casebz{真分数\\假分数}
  7.         }
  8.     \\
  9.     无理数\casebz{正无理数\\负无理数}
  10.     }
  11. \\
  12. 虚数\casebz{纯虚数\\非纯虚数}
  13. }
复制代码
______________________________

完整的测试文件: $type case_in_case.tex (3.61 KB, 下载次数: 64) (用 XeLaTeX 编译)

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2021-8-19 14:21
括号在右边的也弄一个,接着上述导言区,加上
  1. \newcommand\rcase[1]{\left.\begin{aligned}\relax#1\end{aligned}\right\}{}}
  2. \newcommand\rcaseo[1]{\kkkkk{\rcase{#1}}}      %补全距,用于外层及中间
  3. \newcommand\rcaset[1]{\smt{\kkkkk{\rcase{#1}}}}%去高度,用于顶上的
  4. \newcommand\rcaseb[1]{\smb{\kkkkk{\rcase{#1}}}}%去深度,用于底下的
  5. \newcommand\rcasetz[1]{\smt{\rcase{#1}}}       %最后一层专用(为节约资源)
  6. \newcommand\rcasebz[1]{\smb{\rcase{#1}}}       %最后一层专用(为节约资源)
复制代码
用法一样,比如
  1. \fbox{%
  2. \rcaseo{
  3. \rcasetz{k\\kk}k\\
  4. \rcasebz{k\\kk\\kkk\\kkkk}kkk
  5. }%
  6. }
复制代码
得到
QQ截图20210819142022.png

左右放一起对比一下是不是对称嘀:
  1. \[\boxed{
  2. \sum f=
  3. \caseo{
  4. f\caset{
  5.   k\casetz{k\\kk}\\
  6.   kkk\casebz{k\\kk\\kkk\\kkkk}
  7.   }
  8. \\
  9. ff\caseo{
  10.   k\casetz{k\\kk\\kkk}\\
  11.   kk\casebz{k\\kk}
  12.   }
  13. \\
  14. fff\caseb{
  15.    k\casetz{k\\kk\\kkk}\\
  16.    kk\casebz{k\\kk\\kkk\\kkkk}
  17.    }
  18. }
  19. =
  20. \rcaseo{
  21.   \rcaset{
  22.   \rcasetz{k\\kk}k\\
  23.   \rcasebz{k\\kk\\kkk\\kkkk}kkk
  24.   }f
  25. \\
  26.   \rcaseo{
  27.   \rcasetz{k\\kk\\kkk}k\\
  28.   \rcasebz{k\\kk}kk
  29.   }ff
  30. \\
  31.    \rcaseb{
  32.    \rcasetz{k\\kk\\kkk}k\\
  33.    \rcasebz{k\\kk\\kkk\\kkkk}kk
  34.    }fff
  35. }
  36. =\int k
  37. }\]
复制代码
QQ截图20210819142839.png

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2021-8-19 14:54
用 aligned 的好处是可以改变里面东西的对齐方式,比如里面有方程组想在等号对齐之类的。
所以还是有必要再弄一个左边括号的:
  1. \newcommand\lcase[1]{{}\left\{\begin{aligned}\relax#1\end{aligned}\right.}
  2. \newcommand\lcaseo[1]{\kkkkk{\lcase{#1}}}      %补全距,用于外层及中间
  3. \newcommand\lcaset[1]{\smt{\kkkkk{\lcase{#1}}}}%去高度,用于顶上的
  4. \newcommand\lcaseb[1]{\smb{\kkkkk{\lcase{#1}}}}%去深度,用于底下的
  5. \newcommand\lcasetz[1]{\smt{\lcase{#1}}}       %最后一层专用(为节约资源)
  6. \newcommand\lcasebz[1]{\smb{\lcase{#1}}}       %最后一层专用(为节约资源)
复制代码
那么
  1. \fbox{%
  2. \lcaseo{
  3. k&\lcasetz{k&=k\\kk&=kkk}\\
  4. kkk&\lcasebz{k&=k\\kkk&=kk\\kk&=kkk\\kkkk&=k}
  5. }%
  6. }
复制代码
得到
QQ截图20210819145413.png

以上的三组命令,可以混用。

830

主题

4862

回帖

3万

积分

积分
36159

显示全部楼层

isee 发表于 2021-8-19 16:39
如果是哪道题用这么括号,那就"伤心"了

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2021-8-19 16:54
回复 4# isee

有这种需求通常都不是题目了,而是讲义或幻灯片什么的……

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2023-11-10 15:14
放个链接有空再研究:zhihu.com/question/625459872/answer/3246081743

手机版|悠闲数学娱乐论坛(第3版)

GMT+8, 2025-3-4 12:01

Powered by Discuz!

× 快速回复 返回顶部 返回列表