如何填充维吉尼亚方格?

如何填充维吉尼亚方格?

我想做一个维吉尼亚广场,但我必须多次修改它,所以有没有办法用 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

只是为了好玩,另一个基于\foreachOpTeX 宏的解决方案:

\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
 

相关内容