在 LaTeX 中构建表格时,我从 Excel 中导出具有分层表示的数据,但为了获得更优化的打印效果,我需要折叠前四列并用缩进替换左侧的空单元格。
例如Excel中的结构:
| Category | Subcategory | Type | Name | Code | Variable | Note |
|----------|-------------|------|------|------|----------|-----------|
| A | | | | | | |
| | A | A | One | one | one | Something |
| | B | A | One | One | One | Something |
| | C | A | One | One | One | Something |
| B | | | | | | |
| | A | A | One | One | One | Something |
| | | B | One | One | One | Something |
| | B | A | One | One | One | Something |
| | | B | One | One | One | Something |
(Edited to better represent the hierarchy)
为了实现这一点,我遵循了这里的例子向表的类别列添加垂直层次结构线但这涉及大量手动编辑 Latex 表代码(我从表格生成器) - 因此向表中添加新内容非常麻烦。
如下所示:
pst-node
这个包,或者其他包,能否缓解这个列崩溃的过程?
那是,无需手动编辑表格来创建缩进。pst-node
链接问题的答案中使用的 -package 代码有点难以理解,但结果看起来有些接近上面的 MWE 输出。
梅威瑟:
\documentclass[a4paper]{article}
\usepackage[english]{babel}
\usepackage[utf8x]{inputenc}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage[pass]{geometry}
\usepackage{underscore}
\usepackage{booktabs}
\usepackage{lscape}
\usepackage{longtable}
\newcommand{\lvl}{~~~}
\usepackage{array}
\begin{document}
\newgeometry{margin=0.25cm}
\begin{longtable}{p{5.5cm}p{6cm}p{2.5cm}p{4cm}}
\toprule
\textbf{Name} & \textbf{Code} & \textbf{Variable} & \textbf{Note} \\
\midrule
Cat A & A & a & \\
\lvl SubCat A & A_A1 & a_a1_all & Note \\
\lvl\lvl Type A & A_A1_A & a_a1 & \\
\lvl\lvl\lvl Item A & A_A1_A_A & a_a1_a & \\
\lvl\lvl\lvl Item B & A_A1_A_B & a_a1_b & \\
\lvl SubCat B & A_B1 & a_b1_all & Note \\
\lvl\lvl Type B & A_B1_B & a_b1 & \\
\lvl\lvl\lvl Item A & A_B1_A & a_b1_a & \\
\lvl\lvl\lvl Item B & A_B1_B_B & b_a1_b & \\
\bottomrule
\end{longtable}
\restoregeometry
\end{document}
解决方案
事实证明,就我的情况而言,给定 Excel 中的初始表,最简单的方法就是在 Excel 本身中执行此操作。请参阅在 Excel 中水平折叠列在 Stackoverflow 上寻找解决方案。
答案1
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{pmboxdraw}
\usepackage{xcolor}
\def\SFii{\textcolor{red}{\textSFii\textSFx}}
\def\SFviii{\textcolor{red}{\textSFviii\textSFx}}
\def\SFx{\textcolor{red}{\textSFx}}
\def\SFxi{\textcolor{red}{\textSFxi}}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage{array}
\usepackage{booktabs}
\begin{document}
\begin{tabular}{*3{>{\ttfamily}l} l}\toprule
\textrm{\emph{Name}} & \textrm{\emph{Code}} & \textrm{\emph{Variable}} & \emph{Note}
\\\midrule
Cat A & & & \\
\SFviii SubCat A & A\_A1 & a\_a1\_all & Note \\
\SFxi~\SFii Type A & A\_A1\_A & a\_a1 & \\
\SFxi~~~\SFviii Item A & A\_A1\_A\_A & a\_a1\_a & \\
\SFxi~~~\SFii Item B & A\_A1\_A\_B & a\_a1\_b & \\
\SFii SubCat B & A\_B1 & a\_b1\_all & Note \\
~~\SFii Type B & A\_B1\_B & a\_b1 & \\
~~~~\SFviii Item A & A\_B1\_A\_A & a\_b1\_a & \\
~~~~\SFii Item B & A\_B1\_B\_B & b\_a1\_b & \\\bottomrule
\end{tabular}
\end{document}
使用包,newunicodechar
您可以定义字符,并且如果它们存在于您的键盘中则直接使用:
%\usepackage{newunicodechar}
%\newunicodechar{└}{\textSFii}
%\newunicodechar{├}{\textSFviii}
%\newunicodechar{─}{\textSFx}
%\newunicodechar{|}{\textSFxi}
答案2
这是一个使用 的解决方案pst-node
。\psDefBoxNodes{name}{text}
将text
放在一个框中并定义 12 个关联节点:顶部 3 个、中心线上 3 个、底线上 3 个和底部 3 个。节点的名称为name:tl
、ame:tC
、name:tr
等。然后相关节点与自定义命令连接\tconnect
,该命令是\ncangle
具有适当参数的命令:
\documentclass[a4paper]{article}
\usepackage[english]{babel}
\usepackage[utf8x]{inputenc}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage[pass]{geometry}
\usepackage{underscore}
\usepackage{booktabs}
\usepackage{lscape}
\usepackage{longtable}
\newcommand{\lvl}{\hskip1.667em}
\usepackage{array}
\usepackage{pst-node}
\usepackage{auto-pst-pdf}
\newcommand\tconnect[2]{\psset{angleA=-90, angleB=180, offsetA =4pt,%
offsetB=2pt}\ncangle{#1:bl}{#2:Bl}}
\begin{document}
\newgeometry{margin=0.25cm}
\begin{postscript}\psset{linecolor=red, linewidth=0.5pt, nodesepA=1ex, nodesepB =0.5ex, linejoin=1}
\renewcommand\arraystretch{1.5}
\begin{tabular}{p{5.5cm}p{6cm}p{2.5cm}p{4cm}}
\toprule
\textbf{Name} & \textbf{Code} & \textbf{Variable} & \textbf{Note} \\
\midrule
\psDefBoxNodes{cA}{Cat A} & & & \\
\lvl \psDefBoxNodes{scA}{SubCat A} & A_A1 & a_a1_all & Note \\
\lvl\lvl \psDefBoxNodes{tA}{Type A} & A_A1_A & a_a1 & \\
\lvl\lvl\lvl \psDefBoxNodes{iAA}{Item A} & A_A1_A_A & a_a1_a & \\
\lvl\lvl\lvl \psDefBoxNodes{iAB}{Item B} & A_A1_A_B & a_a1_b & \\
\lvl \psDefBoxNodes{scB}{SubCat B} & A_B1 & a_b1_all & Note \\
\lvl\lvl \psDefBoxNodes{tB}{Type B} & A_B1_B & a_b1 & \\
\lvl\lvl\lvl \psDefBoxNodes{iBA}{Item A} & A_B1_A & a_b1_a & \\
\lvl\lvl\lvl \psDefBoxNodes{iBB}{Item B} & A_B1_B_B & b_a1_b & \\
\bottomrule
\end{tabular}
\psset{angleA=-90, angleB=180, offsetA =4pt, offsetB =2pt}
\tconnect{cA}{scA}
\tconnect{cA}{scB}
\tconnect{scA}{tA}
\tconnect{scB}{tB}
\tconnect{tA}{iAA}
\tconnect{tA}{iAB}
\tconnect{tB}{iBA}
\tconnect{tB}{iBB}
\end{postscript}
\restoregeometry
\end{document}
笔记:我认为此代码不会跨页面中断,因此我longtable
用一个简单的环境替换了该环境tabular
。