我想做一个维吉尼亚广场,但我必须多次修改它,所以有没有办法用 multido 或其他方法填充它,而不是用表格和手动填充。
更新
这些都是很棒的答案,让我看到了我是多么的无知。我无法编译,因为我得到了未定义的控制序列类型的错误。但据我所知,所有的例子都很好。我仔细检查了 texlive 是否有问题,但我没有发现任何不正常的地方。说实话,我从来没有想象过这些答案。
更新2
对于 egreg 给出的答案,它得到了
! Undefined control sequence.
l.10 \NewDocumentCommand
{\vigenere}{}
因此它不识别命令的定义,并给出更多关于
! Missing number, treated as zero./! Illegal parameter number in definition of \l_vigenere_body_tl.
对于 Mico/Werner 的回答是要求我安装 Luatex,它应该直接安装在 livetex 中。
! Package luacode Error: LuaTeX is required for this package. Aborting..
我不知道如何使用 wipet 答案,因为我认为这必须在某个 .sty 文件上完成。
更新 3 lualatex 已成功生成,如答案所示。感谢 Mico
答案1
已经有很多解决方案了,但我想添加更多,我将其用于我尚未出版的书。这有点棘手,但代码相当简单,易于阅读和理解,希望你喜欢它 :-)
\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[x=0.5cm, y=0.5cm]
\foreach \z [count=\zx] in {Z,...,A}{%
\foreach \b [count=\bx] in {\z,...,Z}{%
\node [anchor=base] (N\bx\zx) at (\bx,\zx) {\b};
}
}
\foreach \z [count=\zx] in {A,...,Y}{%
\foreach \b [count=\bx] in {\z,...,A}{%
\node [anchor=base] (S\bx\zx) at (27-\bx,26-\zx) {\b};
}
}
\end{tikzpicture}
\end{document}
答案2
每次填充表格一行。
\documentclass{article}
\usepackage[table]{xcolor}
\definecolor{headers}{RGB}{234,232,218}
\ExplSyntaxOn
\tl_new:N \l_vigenere_body_tl
\NewDocumentCommand{\vigenere}{}
{
% make the first row
\tl_set:Nn \l_vigenere_body_tl { \hline \rowcolor{headers} }
\tl_put_right:Nx \l_vigenere_body_tl
{
\int_step_function:nN {26} \vigenere_first:n
}
\tl_put_right:Nn \l_vigenere_body_tl { \\ \hline }
\int_step_inline:nn { 26 }
{
\tl_put_right:Nn \l_vigenere_body_tl { \bfseries \int_to_Alph:n { ##1 } }
\tl_put_right:Nx \l_vigenere_body_tl
{
\int_step_function:nnN { ##1 } { ##1+25 } \vigenere_further:n
}
\tl_put_right:Nn \l_vigenere_body_tl { \\ \hline }
}
\group_begin:
\setlength{\tabcolsep}{0.5pt}\sffamily
\begin{tabular}{ | >{\columncolor{headers}}c | *{26}{c|} }
\l_vigenere_body_tl
\end{tabular}
\group_end:
}
\cs_new:Nn \vigenere_first:n { & \exp_not:N \bfseries \int_to_Alph:n { #1 } }
\cs_new:Nn \vigenere_further:n
{
& \int_to_Alph:n { \int_mod:nn { #1-1 } { 26 } + 1 }
}
\ExplSyntaxOff
\begin{document}
\vigenere
\end{document}
答案3
这是一个基于 LuaLaTeX 的解决方案。
\documentclass{article}
\usepackage[letterpaper,margin=1in]{geometry} % set page parameters suitably
\usepackage{array} % for '\extrarowheight' macro
\usepackage[table]{xcolor}
\usepackage{luacode}
\begin{luacode}
s="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-- an auxiliary function
function rowprint ( t )
for i = 1,26 do
tex.sprint ( "&" .. t:sub(i,i) )
end
tex.sprint ("\\\\ \\hline")
end
-- the main function
function vigenere ()
tex.sprint ( "\\hline" )
-- header row
tex.sprint ( "\\rowcolor{lightgray}" )
for i = 1,26 do
tex.sprint ( "&\\textbf{\\textsf{" .. s:sub(i,i) .. "}}" )
end
tex.sprint ("\\\\ \\hline")
-- data rows (from A to Z )
t = s
for j=1,26 do
t = s:sub(j) .. s:sub(1,j-1)
tex.sprint ( "\\cellcolor{lightgray}\\textbf{\\textsf{" .. t:sub(1,1) .. "}}" )
rowprint ( t )
end
end
\end{luacode}
\begin{document}
\begin{center}
\setlength\tabcolsep{3pt}
\setlength\extrarowheight{3pt}
\begin{tabular}{|*{27}{c|}}
\directlua{vigenere()}
\end{tabular}
\end{center}
\end{document}
答案4
只是为了好玩,另一个基于\foreach
OpTeX 宏的解决方案:
\def\list{ABCDEFGHIJKLMNOPQRSTUVWXYZ}
\def\cyclelist#1#2\relax{\def\list{#2#1}}
\def\fr#1{\hbox to1.3em{\hss#1\hss\vrule height10pt depth4pt}}
\vbox{
\hbox{\ea\foreach\list \do{\hbox to1.3em{\hss\bf #1\hss}}}
\smallskip\hrule
\ea\foreach\list \do{%
\hbox{\llap{\bf#1 }\vrule\ea\foreach\list \do{\fr{##1}}}
\hrule
\ea\cyclelist\list \relax
}%
}
\bye