根据单词列表创建格式化表格

根据单词列表创建格式化表格

我正在编写一本包含大量双语示例的语法书,同时尝试学习回忆录课程。这本书将包含许多表格,如下所示: 在此处输入图片描述

作为参考,这是我用来制作上述表格的代码(其中 \dak 和 \eng 只是我在 XeLateX 中使用的两种不同字体的简写名称。)

\begin{center}
\begin{tabular}{ c c c}
\toprule
{\dak wayáte} & {\dak waŋčhíyaŋke} & {\dak wičháuŋk'upi}\\
{\eng You ate.} & {\eng I see you.} & {\eng We gave it to them. }\\
&&\\
{\dak čhičhíčaǧe} & {\dak nihdúžaža }& {\dak šá}\\
{\eng I made it for you.} & {\eng You washed yourself.} & {\eng It is red.}\\ 
\bottomrule
\end{tabular}
\end{center}

但是,我更愿意设计某种环境 / 命令,可以自动接收像这样的单词及其翻译列表,并输出正确格式的表格。这是我对此类项目的初步尝试之一:

\documentclass{memoir}
\usepackage{fontspec}
\newfontfamily\dak{Linux Biolinum O}
\newfontfamily\eng{JosefinSans-SemiBold}
\newenvironment{DakEx31}[6]{% 
\begin{table}
\centering
\renewcommand{\arraystretch}{1.2}
\begin{tabular}{*{3}{c}}
    \toprule
{\dak #1} &{\dak #2}&{\dak #3}\\
{\eng #4}&{\eng #5}&{\eng #6}\\
\bottomrule
}
{\end{tabular}
\end{table}}


\begin{document}

\begin{DakEx31}
{wayáte}{waŋčhíyaŋke}{wičháuŋk'upi}
{You ate.}{I see you.}{We gave it to them.}
\end{DakEx31}

\end{document}

生成一个美观的表格,宽度为 3 个示例,高度为 1 个示例。但是,显然采用这种方法,我需要为我想要的每个大小的表格定义不同的命令,如果在编写过程中需要添加/更改给定部分中提供的示例,我希望避免这种情况。此外,当我尝试使表格更大时,这种方法失败了,因为这样的命令只能接受 9 个输入。

我使用 TeX 的主要经验是输入数学论文;所以我了解的还不够多,无法在这里设计我需要的环境。我正在寻找一个命令,我可以在其中指定列数(如果需要,还可以指定行数),然后输入单词列表/它们的翻译,然后输出一个格式良好的表格,其中 Dakota 文本使用一种字体,英语文本使用另一种字体,示例行之间有一个空白行。谢谢!

答案1

这应该可以解决问题。由于我没有安装您的字体,因此我使用了\textsf\textit,但您应该能够根据自己的意愿进行调整。

没有太多要说的,我改编了解决方案这里

注意,最大列数是在变量中定义的\maxcolumns。您可以根据需要更改它。

在此处输入图片描述

用法如下:

\begin{vartab}
  \english{word1,word2,word3,word4}
  \french{mot1,mot2,mot3,mot4}
\end{vartab}

完整代码:

\documentclass{memoir}
%\usepackage{fontspec}
%\newfontfamily\dak{Linux Biolinum O}
%\newfontfamily\eng{JosefinSans-SemiBold}
\newcommand\dak{\textsf}
\newcommand\eng{\textit}


\renewcommand{\arraystretch}{1.2}

\usepackage{etoolbox}

\newcommand{\doenglish}[1]{\appto\temp{&\dak{#1}}}
\newcommand{\dofrench}[1]{\appto\temp{&\eng{#1}}}


\newcommand{\english}[1]{%
  \def\temp{}% initialize to empty
  \forcsvlist{\doenglish}{#1}% add entries
  \appto\temp{\\}% end the row
  \temp % deliver contents
}

\newcommand{\french}[1]{%
  \def\temp{}% initialize to empty
  \forcsvlist{\dofrench}{ #1}% add entries
  \appto\temp{\\}% end the row
  \temp % deliver contents
}


\newenvironment{vartab}
  {\begin{tabular}{ c@{} *{\maxcolumns}{c} } \toprule}
  {\bottomrule\end{tabular}}

\def\maxcolumns{20}

\begin{document}
\thispagestyle{empty}

\begin{vartab}
\english{Word1,Word2,Word3}
\french{Mot1,Mot2,Mot3}
\end{vartab}

\begin{vartab}
\english{word1,word2,word3,word4}
\french{mot1,mot2,mot3,mot4}
\end{vartab}

\begin{vartab}
\english{word1,word2,word3,word4,word5,word6,word7,world8,word9,word10}
\french{mot1,mot2,mot3,mot4,mot5,mot6,mot7,mot8,mot9,mot10}
\end{vartab}

\end{document}

答案2

由于它不涉及前后规则,因此不是一个完整的答案,但可以继续。它使用宏memoir \autorows

\documentclass{memoir}
\newcommand{\trans}[2]{\shortstack{#1 \\ \textbf{#2} \\ \mbox{}}}
\pagestyle{empty}
\begin{document}
\autorows{c}{3}{c}{%
  trans{one}{eins},\trans{two}{zwei},\trans{three}{drei},\trans{four}{vier}.
  \trans{five}{funf},\trans{six{sechs},    \trans{seven}{sieben}}
\end{document}

在此处输入图片描述

相关内容