【问题标题】:Does LaTeX have an array data structure?LaTeX 有数组数据结构吗?
【发布时间】:2011-02-08 12:19:05
【问题描述】:

LaTeX 中有数组吗?我不是指排版数组的方式。我的意思是将数组作为 LaTeX/TeX 中的数据结构作为“编程语言”。我需要在一个数组中存储一些 vbox-es 或 hbox-es。它可能类似于“宏数组”。

更多细节:我有一个应该排版歌曲的环境。我需要存储一些歌曲的段落作为我的宏 \songparagraph 的参数(所以我不会排版它们,只存储这些段落)。因为我不知道在一首特定的歌曲中可以有多少段落,所以我需要一个数组。当环境关闭时,所有段落都将被排版 - 但首先会测量它们并计算每个段落的最佳位置(例如,可以将某些段落放在两列中,以使歌曲看起来更紧凑,节省一些空间)。

欢迎任何想法。 如果您了解 LaTeX 中的数组,请发布一些基本文档、教程的链接,或者只是陈述基本命令。

【问题讨论】:

    标签: arrays latex tex hbox


    【解决方案1】:

    readarray 包允许将格式化数据输入到元素中 2-D 或 3-D 数组(或 1-D 文件记录数组)。

    \documentclass{standalone}
    \usepackage{readarray}
    
    \def\data{% the data
    1 15 14 4
    10 11 8 5
    7 6 9 12
    16 2 3 13
    }
    \readarray\data\dataA[4,4] %read the data to \dataA
    
    \begin{document}
    value at (2,1) = \dataA[2,1] %access a specific field
    \end{document}
    

    【讨论】:

      【解决方案2】:

      查看为 LaTeX 实现数组的 Arrayjob。诚然,我只是偷看了它,所以我不知道它的效果如何。但是,如果您不必自己编写...

      【讨论】:

        【解决方案3】:

        Luatex 有 Lua 的表,可以泛化数组。如果拥有标准 Latex 对您来说并不重要,请考虑将 Luatex 与 Latex 一起使用。然后,您可以执行以下操作:

        \def\lookup#1{\directlua {
            local array={1,2,4,8}; tex.print(array[#1])}}
        \[ 2 \mapsto \lookup{2} \]
        

        Luatex 与 Latex 相比有点不稳定,因为需要对 Latex 代码中的各种 Lua 字符进行转义。 Context 有 \startluacode ... \stopluacode 宏来处理 Lua 代码定义,\ctxlua 用于 Lua 代码调用,我看不出为什么不能为 Latex 定义这样的东西。

        【讨论】:

          【解决方案4】:

          您还可以查看 datatool 包或 expl3 编程系统,以及“属性列表”数据类型。

          【讨论】:

            【解决方案5】:

            pgfkeys 和 pgffor 也可能对你有用。它们是pgf(便携式图形格式)包的一部分,但它们可以独立于所有图形内容使用。

            【讨论】:

              【解决方案6】:

              为了扩展帕特里克的回答,简短的回答是“不”。但是,由于它具有宏扩展,因此可以将其编程为具有数组。

              这是另一个例子,这个例子使用 push 和 pop 来表示“数组”。当\type@pushcolour 被调用时,它将当前颜色保存到堆栈中。 \type@popcolour 采用顶部颜色定义,并使用它:

              \newcount\type@count
              \def\type@pushcolour{%
                \xglobal\colorlet{foo\the\type@count}{.}%
              \global\advance\type@count by1\relax}
              \def\type@popcolour{%
                \global\advance\type@count by-1\relax%
              \color{foo\the\type@count}}
              

              (我从 beamer 包的源代码中改编了这段代码)

              【讨论】:

                【解决方案7】:

                这是一个数组如何在 LaTeX 中实现:

                \documentclass{article}
                \begin{document}
                
                \newcounter{mycounter}
                \setcounter{mycounter}{1}
                
                % ary is any prefix you want, it should not exist as a command.
                
                \expandafter\newcommand\csname ary\the\value{mycounter} \endcsname{myfirstelement}
                \stepcounter{mycounter}
                \expandafter\newcommand\csname ary\the\value{mycounter} \endcsname{mysecondelement}
                
                \csname ary1 \endcsname
                
                or
                
                \newcounter{index}
                \setcounter{index}{2}
                
                \csname ary\the\value{index} \endcsname
                
                \end{document}
                

                通过 LaTeX(latex mydoc.tex 或 pdflatex mydoc.tex)运行它,你会看到输出。

                简短说明:这会创建两个命令(使用 newcommand):ary1 和 ary2。需要\expandafter,因为newcommand 不应定义\csname,而是由\csname ... \endcsname 创建的命令。 \expandafter跳过下一个标记,在这种情况下是控制序列\newcommand,并在TeX 看到\newcommand 之前执行下一个命令。这意味着,TeX 看到的新命令行中的第一件事是 \csname...\endcsname 构造,TeX 执行它然后执行 \newcommand 并使用 \csname...\endcsname 构造的结果. \csname foo\endcsname\foo 相同,但您可以在\csname...\endcsname 创建的命令中使用任何字符甚至空格。

                这不是小事。请参阅 Victor Eijkhout 的伟大著作“TeX by topic”:http://eijkhout.net/texbytopic/texbytopic.html

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-08-27
                  • 2010-11-09
                  • 2013-06-05
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-03-04
                  相关资源
                  最近更新 更多