테이블용 매크로 필요 - 행 및 열 크기와 무관

테이블용 매크로 필요 - 행 및 열 크기와 무관

테이블에 대해 다음 매크로를 만들었습니다.

\newcommand{\createtable}[7]{
\begin{table}[htbp]
\begin{tabular}{|p{8cm}||p{8cm}|}
\hline
\begin{center}\textbf{\cellcolor{Orchid!25}{#1}}\end{center} &
\begin{center}\textbf{\cellcolor{Orchid!25}{#2}}\end{center} \\
\hline\hline
 {#3} 
 & {#4}\\
 \hline
 {#5}
 & {#6}\\ 
\hline
    \end{tabular}%
 \centering
 \caption{#7}
\end{table}
}

용법:

\createtable
    {Label1} 
    {Label2}
    {Text1-1}
    {Text2-1}
    {Text1-2}
    {Text2-2}
    {Table Title}

산출:

여기에 이미지 설명을 입력하세요

문제:

참조: 선택적 여러 줄 인수와 암시적 항목화 환경이 있는 \newcommand

여기서는 항목 수에 대한 사전 지식 없이도 동적 글머리 기호 목록을 만들 수 있습니다.

테이블에 비슷한 매크로가 필요하므로 다음과 같이 작성합니다.

\createtable
  {Label1}
  {Label2}
  {Label3}
  {Text1-Label1
   \&
   Text1-Label2
   \&
   Text1-Label3
   \\
   Text2-Label1
   \&
   Text2-Label2
   \& 
   Text2-Label3
}   

매크로는 다음을 알아낼 수 있을 만큼 지능적이어야 합니다.

[1] Table has 3 columns -- Label1, Label2 and Label3
[2] Distribute the text-input separated by \& among these columns, i.e. 
   Text1-Label1 under Label1, Text1-Label2 under Label2 and Text1-Label3 under Label3

[3] Identify the end of row marker as "//"
    and add further entries (using the procedure described in 
    point [2]) to the next row. 

누구든지 몇 가지 조언을 제공해 주실 수 있습니까?

이것이 제가 처음에 시도한 것입니다:

\ExplSyntaxOn
\NewDocumentCommand{\testtable}{ m o }
{
  % split the \\ separated list of items
  \seq_set_split:Nnn \l_egreg_outline_items_seq { \\ } { #1 }
\begin{tabular}{|p{8cm}||p{8cm}|}
\hline
\begin{center}\textbf{\cellcolor{Orchid!25}{Column1}}\end{center} &
\begin{center}\textbf{\cellcolor{Orchid!25}{Column2}}\end{center} \\
\hline\hline
  \seq_map_inline:Nn \l_egreg_outline_items_seq
   {
    ##1 %\hline
   }
    \end{tabular}%
}
\ExplSyntaxOff

런타임 시 열 수를 제공할 수 없는 경우에는 괜찮습니다. 하지만 행 수는 동적으로 추가되어야 합니다.

답변1

나는 다음과 같은 사용법을 제안한다 \createtable:

\createtable 3 {3cm}
  {Label1}        {Label2}       {Label3}
  {Text1-Label1 | Text1-Label2 | Text1-Label3 |
   Text2-Label1 | Text2-Label2 | Text2-Label3 }
  {Table title}

열 개수(예제에서는 3)와 열 너비(예제에서는 3cm)를 지정해야 함을 알 수 있습니다. 예제에서는 고정된 열 너비를 사용하고 있으므로 이를 지정해야 할 이유가 있습니다.

구현은 다음과 같아야 합니다.

\newcount\tmpnum   
\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}

\def\createtable#1#2{\def\tabcols{#1}\def\colwidth{#2}%
   \def\tabdata{}\def\tabdataA{}\tmpnum=0 \createtableA}
\def\createtableA#1{\advance\tmpnum by1
   \addto\tabdata{\begin{center}\textbf{\cellcolor{red!25}{#1}}\end{center}}%
   \addto\tabdataA{|p{\colwidth}|}%
   \ifnum\tabcols>\tmpnum
      \addto\tabdata{&}\expandafter\createtableA
   \else
      \addto\tabdata{\\ \hline\hline}\expandafter\createtableB
   \fi
}
\def\createtableB#1{\tmpnum=0 \createtableC#1||}
\def\createtableC#1|{\ifx|#1|\expandafter\createtableD\else   
   \advance\tmpnum by1
   \ifnum\tabcols=\tmpnum \addto\tabdata{{#1}\\ \hline}\tmpnum=0
   \else \addto\tabdata{{#1}&}%
   \fi
   \expandafter\createtableC \fi
}
\def\createtableD#1{%
   \begin{table}[htbp]
   \edef\tmp{\noexpand\begin{tabular}{\tabdataA}}\tmp
   \hline
   \tabdata
   \end{tabular}
   \centering\caption{#1}
   \end{table}
}

답변2

고유한 인수로 레이블을 입력하면 열 개수를 쉽게 파악할 수 있습니다.

\documentclass{article}
\usepackage{xparse}
\usepackage[table]{xcolor}
\usepackage{tabularx}
\usepackage{booktabs}

\ExplSyntaxOn
\NewDocumentCommand{\createtable}{mm}
 {
  \sandeep_ct_create_table:nn { #1 } { #2 }
 }

\int_new:N \l_sandeep_ct_cols_int
\seq_new:N \l_sandeep_ct_head_input_seq
\seq_new:N \l_sandeep_ct_head_output_seq
\seq_new:N \l_sandeep_ct_table_body_seq

\cs_new_protected:Npn \sandeep_ct_create_table:nn #1 #2
 {
  \seq_set_split:Nnn \l_sandeep_ct_head_input_seq { & } { #1 }
  \int_set:Nn \l_sandeep_ct_cols_int
   {
    \seq_count:N \l_sandeep_ct_head_input_seq
   }
  \seq_set_map:NNn \l_sandeep_ct_head_output_seq \l_sandeep_ct_head_input_seq
   {
    \exp_not:n { \multicolumn{1}{c}{\ctbigstrut\bfseries ##1} }
   }
  \seq_set_split:Nnn \l_sandeep_ct_table_body_seq { \\ } { #2 }
  \begin{tabularx}{\columnwidth}{*{\l_sandeep_ct_cols_int}{X}}
  \toprule
  \addlinespace[0pt]
  \rowcolor{orchid}
  \seq_use:Nn \l_sandeep_ct_head_output_seq { & } \\
  \addlinespace[0pt]
  \midrule
  \seq_use:Nn \l_sandeep_ct_table_body_seq { \\ \addlinespace }
  \\
  \bottomrule
  \end{tabularx}
 }

\ExplSyntaxOff

\newcommand{\ctbigstrut}{%
  \vrule height .8cm
         depth \dimexpr.8cm-\ht\strutbox\relax
         width 0pt
}

\definecolor{orchid}{RGB}{242,213,230}

\begin{document}

\noindent
\createtable
 {
  Label 1 & Label 2
 }
 {
  Text1-Label1
  &
  Text1-Label2
  \\
  Text2-Label1
  &
  Text2-Label2
}   

\bigskip

\noindent
\createtable
 {
  Label 1 & Label 2 & Label 3
 }
 {
  Text1-Label1
  &
  Text1-Label2
  &
  Text1-Label3
  \\
  Text2-Label1
  &
  Text2-Label2
  & 
  Text2-Label3
 }

\end{document}

첫 번째 인수는 &열 수를 계산하기 위해 분할됩니다. 그런 다음 항목은 의 인수로 배치됩니다 \multicolumn.

그런 다음 행 사이에 \\추가할 수 있도록 테이블 본문을 분할합니다 .\addlinespace

여기에 이미지 설명을 입력하세요

관련 정보