使用 for 循环遍历列表创建表

使用 for 循环遍历列表创建表

我目前正在尝试学习 Latex 并用它来写简历。我被困在想要列出我的技能的那个点上。我只想要一个简单的函数,它可以获取动态技能列表并从中创建一个表格。我读了很多使用 pggfor 或 etoolbox 等的东西,我有点累了。它们中的大多数都不容易阅读,对于初学者来说似乎太复杂了。

\documentclass{article}
\begin{document}

\newcommand\createskill[2]{%
    \textsc{\textbf{#1}} & #2
}

\newcommand\createskills[1]{%
  \begin{tabular}{r|l}
    \makeatletter
    \@for\thisitem:=#1\do{\thisitem \\} %in the last iteration of loop a new line is added also 
    \makeatother
  \end{tabular}
}

% usage
\newcommand{\skillone}{\createskill{programming}{Python Java }}
\newcommand{\skilltwo}{\createskill{math}{Calculus Statistics}}
\createskills{\skillone, \skilltwo}
\end{document}

我的问题是,由于\\在最后一次迭代中还添加了一个新行,因此我得到了一个只有一个分隔符的空表行。我愿意接受建议,使用一个不会\\在最后一次迭代中添加此内容的 for 循环。

最终结果

我尝试了另一种使用\foreach命令的解决方案。尽管我删除了最后一行中不必要的内容,但当包含在环境\\中时,这种方法效果不佳。tabular

\newcommand\createtablecontent[1]{%
    \foreach \x [count=\xi] in {#1} {\ifthenelse{\xi=1}{\x}{\\ \x}}
}

\newcommand\createskillsanothertry[1]{% called in the same way \createskills
    \begin{tabular}{r|l} 
      \createtablecontent{#1}
      \end{tabular}
}

在此处输入图片描述

通过上述解决方案,我只有第一行和 22 个警告,这看起来相当复杂。

如果我排除表格环境,我就会得到创建两行内容的期望行为。

\newcommand\createskillsanothertry[1]{%
      \createtablecontent{#1}
}

在此处输入图片描述

答案1

您可以使用 来完成expl3

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\createskills}{m}
 {
  \begin{tabular}{r|l}
  \clist_map_function:nN { #1 } \irestmycase_skill:n
  \end{tabular}
 }

\cs_new_protected:Nn \irestmycase_skill:n
 {
  \tl_if_single:nTF { #1 }
   {
    \exp_last_unbraced:No \__irestmycase_skill_process:nn #1
   }
   {
    \__irestmycase_skill_process:nn #1
   }
 }
\cs_new_protected:Nn \__irestmycase_skill_process:nn
 {
  \textsc{#1} & #2 \\
 }

\ExplSyntaxOff

\begin{document}

% usage
\newcommand{\skillone}{{programming}{Python Java}}
\newcommand{\skilltwo}{{math}{Calculus Statistics}}
\createskills{\skillone, \skilltwo}

\bigskip

\createskills{
  {programming}{Python Java},
  {math}{Calculus Statistics}
}

\end{document}

在此处输入图片描述

答案2

我们不需要\directlua也不expl3需要解决这个问题。以下解决方案仅基于 TeX 基元:

\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
\def\skilllist{}
\def\createskill#1#2{\addto\skilllist{#1&#2\cr}}
\def\printskills{\vbox{\halign{\hfil\bf##\ \vrule\strut&\ ##\hfil\cr\skilllist}}}

\createskill{programming}{java python lua TeX}
\createskill{mathematics}{calculus statistics}
\createskill{languages}{english spanish korean}

\printskills

\createskill将数据以(表) 参数\skillist中可用的形式添加到内部。并使用原始数据和来自 的数据打印表格。\halign\printskills\halign\skillist

答案3

使用 LuaLaTeX,如果有这个选项,那很容易。你只需要两个函数,\createskill并且\printskill(你可以重命名它们随意)。我仅使用 TeX Gyre Schola 进行显示,因为它支持小型大写字母。

%!TEX program = lualatex
%LuaLaTeX is mandatory here
\documentclass{standalone}
\usepackage{fontspec}
\setmainfont{TeX Gyre Schola}
\usepackage{luacode}
\begin{luacode*}
Skills = Skills or {}

function capitalise(str)
    local gmatch = unicode.utf8.gmatch
    local upper = unicode.utf8.upper
    local sub = unicode.utf8.sub
    local uppers = {}
    for w in str:gmatch("%S+") do
        table.insert(uppers, upper(sub(w,1,1))..sub(w,2))
    end
    return table.concat(uppers, " ")
end

function createskill(a,b)
    local str = [[\textbf{\textsc{]]..a..[[}} & ]]..capitalise(b)
    table.insert(Skills, str)
end

function printskills()
    tex.print([[\begin{tabular}{r|l}]])
    tex.print(table.concat(Skills, [[\\]]))
    tex.print([[\end{tabular}]])
end
\end{luacode*}
\newcommand{\createskill}[2]{\directlua{createskill("#1", "#2")}}
\newcommand{\printskills}{\directlua{printskills()}}
\begin{document}
%You add skills with this macro
\createskill{programming}{java python lua}
\createskill{mathematics}{calculus statistics}
\createskill{languages}{english spanish korean}
%And you print them all with this macro:
\printskills
\end{document}

在此处输入图片描述

相关内容