![如何利用大括号实现分支结构图](https://linux22.com/image/294399/%E5%A6%82%E4%BD%95%E5%88%A9%E7%94%A8%E5%A4%A7%E6%8B%AC%E5%8F%B7%E5%AE%9E%E7%8E%B0%E5%88%86%E6%94%AF%E7%BB%93%E6%9E%84%E5%9B%BE.png)
\documentclass{ctexart}
\setCJKmainfont{宋体}
\usepackage{amsmath,mathptmx}
\begin{document}
$
\text{《内经》学术体系}
\begin{cases}
\text{医学理论}
\begin{cases}
\text{藏象}
\begin{cases}
\text{脏腑}\\
\text{经络}\\
\text{精气神}
\end{cases}\\
\text{疾病}
\begin{cases}
\text{病机}
\begin{cases}
\text{病因}\\
\text{发病}\\
\text{病理}\\
\text{传变}
\end{cases}\\
\text{病症}
\end{cases}
\end{cases}\\
\text{医学基础}
\begin{cases}
\text{哲学}\\
\text{天文历法}\\
\text{地理学}\\
\text{气象学}\\
\text{数学}\\
\text{社会学}
\end{cases}\\
\end{cases}
$
\end{document}
答案1
我已经开始使用 TikZ 了,但如果能告诉我如何更有效地完成这项工作,我将不胜感激。请注意,我使用的是西拉特克斯在 Mac 上的 TeXShop 中。这不是完整的图表,如果我拼错了任何汉字,我深表歉意。这只是一个起点。
% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = XeLaTeX
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,decorations.pathreplacing,calc}
\usepackage{fontspec}
\setmainfont{Adobe Song Std L}
\begin{document}
\begin{tikzpicture}[node distance=0.5em]
\node (main) at (0,0) {《内经》学术体系};
\node (t1) at (1in,5\baselineskip) {医学理论};
\node (t2) at (1in,-5\baselineskip) {医学基础};
\draw[decorate,decoration={brace,mirror}] (t1.west) -- (t2.west);
\node [right =of t1,yshift=7\baselineskip] (st1) {藏象};
\node [right =of t1,yshift=2\baselineskip] (st2) {疾病};
\node [right =of t1,yshift=-1.5\baselineskip] (st3) {诊法};
\node [right =of t1,yshift=-4\baselineskip] (st4) {论治};
\node [right =of t1,yshift=-6.5\baselineskip] (st5) {养生};
\draw[decorate,decoration={brace,mirror,aspect=0.525}] (st1.west) -- (st5.west);
\node [right =of st1,yshift=1.5\baselineskip] (sst1) {脏腑};
\node [right =of st1] (sst2) {经络};
\node [right =of st1,yshift=-1.5\baselineskip] (sst3) {精气神};
\node [right =of st2, yshift =1\baselineskip] (sst4){病机};
\node [right =of st2, yshift =-2.5\baselineskip] (sst5){病证};
\draw[decorate,decoration={brace,mirror}] (sst1.west) -- (sst3.west);
\node [right =of sst4, yshift=1.5\baselineskip] (ssst1) {病因};
\node [right =of sst4, yshift=0.5\baselineskip] (ssst2) {发病};
\node [right =of sst4, yshift=-0.5\baselineskip] (ssst3) {病理};
\node [right =of sst4, yshift=-1.5\baselineskip] (ssst4) {传变};
\draw[decorate,decoration={brace,mirror}] (ssst1.west) -- (ssst4.west);
\draw[decorate,decoration={brace,mirror}] (sst4.west|-ssst1) -- (sst5.west);
\end{tikzpicture}
警告确实需要一点调整才能让它按照你想要的方式出现。
一些背景和解释:
这个问题展示了两个强大的 TikZ 工具:
节点的相对位置。* 右侧的 = 使用户无需计算距离和摆弄尺寸。(TikZ 文档第 13 章。)
使用节点名称也是一种解放,因为你不必精确地记下节点的位置——你只需引用它的名称。(TikZ 文档第 16 章。)其中有趣的部分是在第四列字符中,从顶部开始的第二组:括号延伸到顶部的字形对上方。这是通过以下方式实现的:
\draw[decorate,decoration={brace,mirror}] (sst4.west|-ssst1) -- (sst5.west);
它起始于sst5.west
并延伸至 sst4.west 的 x 坐标,但结束于 ssst1 的 y 坐标。
我通过将原文视为字符列来解决这个问题。每个垂直组可以分成更小的组,并在它们旁边画上括号。
如果我有时间,我可能会完成它。我认为所有艰苦的工作都完成了……
答案2
最后,我使用 schemata 包解决了这个问题。虽然不是太完美。
% -*- coding: utf-8 -*-
%!TEX program = xelatex
\documentclass{article}
\usepackage{fontspec}
\setmainfont{宋体}
%-----------------------------------------
\usepackage{schemata,xpatch}
\xpatchcmd{\schema}
{1.44265ex}{-1ex}
{}{}
\newcommand\SC[2]{\schema{\schemabox{#1}}{\schemabox{#2}}}
\newcommand\SCh[4]{\Schema{#1}{#2}{\schemabox{#3}}{\schemabox{#4}}}
%-----------------------------------------
\begin{document}
{
\small\centerline{《内经》病因系统表}\smallskip
\label{fig:《内经》病因系统表}
\renewcommand{\baselinestretch}{1}
\hspace{.1\textwidth}%左侧空白
\SCh{-5.7ex}{6ex}{致病因素}{\smallskip
\SC{自然环境}{
天气:风、雨、寒、暑、湿、燥、雾、露等\\
天象:天宿失度,日月薄蚀,月郭圆缺\\
地理:地域,地势
}\\
\SC{社会环境}{
政治:政体,战争,职位\\
经济:经济制度,贫富差异\\
道徳:嗜欲无穷(物欲、权欲、色欲)\\
心理:情志异常\\
信仰:崇拜,迷信\\
民俗:地区风气,生活习俗\\
饮食:嗜食,偏食,饱食,冷食\\
劳伤:体劳,房劳\\
中毒:毒物(包括药物),醉酒}
}\hfill }
{
\label{fig:《内经》学术体系基本框架结构图}
\renewcommand{\baselinestretch}{1}
\small
\hspace{.1\textwidth}%左侧距离
\SCh{9.5ex}{11.3ex}{《内经》学术体系}{
\SCh{0.1ex}{13.7ex}{医学理论}{\smallskip
\SC{藏象}{脏腑\\经络\\精气神}\\\smallskip
\SCh{2.8ex}{2.9ex}{疾病}{
\SC{病机}{病因\\发病\\病理\\传变}\\
病症}\\\smallskip
\SC{诊法}{\smallskip 诊病方法\\断病法则}\\\smallskip
\SC{论治}{治则\\治法\\疗法\\测试}\\\smallskip
\SC{养生}{\smallskip 摄生\\康复}
}\\
\SC{医学基础}{
哲学\\
天文历法\\
地理学\\
气象学\\
数学\\
社会学}
}\hfill }
\end{document}