![使用 for 循环遍历列表创建表](https://linux22.com/image/411726/%E4%BD%BF%E7%94%A8%20for%20%E5%BE%AA%E7%8E%AF%E9%81%8D%E5%8E%86%E5%88%97%E8%A1%A8%E5%88%9B%E5%BB%BA%E8%A1%A8.png)
我目前正在尝试学习 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\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}