先决条件

先决条件

我知道 LuaTeX 可以访问网络资源(至少 ConTeXt 可以)。是否可以使用 LuaLaTeX 在编译时动态地从 Google Docs 电子表格中获取宏中的单元格值?

我创建了一个文件样本希望没有身份验证问题。

我发现这个项目这可能会有帮助,但似乎并不是很有效。

答案1

如果你坚持 ... 干得好

先决条件

Google 仅通过 HTTPS 提供服务。这总体上是件好事,但是由于 Luatex 不内置 SSL 支持,因此需要付出的努力会大大增加。因此,我们必须添加外部依赖项。对于我的解决方案,我选择了 卢阿塞克库,因为它与 Lua 5.2 完美集成。Luasec 是 OpenSSL 的包装器,因此您也需要它。(它无处不在,因此它可能随您的操作系统一起提供。)

与 Google 合作

真正的麻烦始于我们尝试检索电子表格的 CSV 版本时。乍一看,这似乎是一项简单的任务:调用ssl.https.request()URL 即可完成。但 Google 并非如此:我们必须经过多次重定向,他们的服务器才会允许我们接近数据。非常不幸的是,考虑到Luasec 不处理重定向。因此,我们必须自己创建请求才能到达最终的 URI。因此,大约一半的代码都与 HTTP 有关。如果您想扩展实现,可以完全跳过这些部分。

处理数据

一旦我们有了 CSV 格式的电子表格,事情就变得简单多了。我们使用通用的 CSV解析器自带 卢阿利布斯 并将其格式化为 LaTeX 标记。

该函数urihandler()被导出到命名空间中 packagedata.spreadsheet。用户级宏是围绕该函数的包装器:

\documentclass {scrartcl}

\usepackage         {luatexbase}
\RequireLuaModule   {lualibs}
\usepackage         {luaotfload} %% recommended, in that order!
\RequireLuaModule   {spreadsheet}

\makeatletter

\protected \def \googlespreadsheet {%
  \@ifnextchar[\googlespreadsheetopt
               {\googlespreadsheetopt[]}%
}

\def \googlespreadsheetopt [#1]#2{%
  \edef \currentspreadsheetoptions {#1}%
  \directlua {
    packagedata.spreadsheet.urihandler ([[\currentspreadsheetoptions]],
                                        [[\detokenize {#2}]])
  }%
}

\makeatother

\begin {document}

  \input knuth

  \begin {table} [h]
    \googlespreadsheet [center,dump]
      {https://docs.google.com/spreadsheet/ccc?key=0Amykmqr4Of-MdEVIUUcyYld3WTJhZnJHRkgwSF9CaUE&usp=sharing}
  \end {table}

  \input knuth

\end {document}

结果:

演示图像

选项

该示例定义了一个宏\googlespreadsheet,该宏将电子表格的 URI 作为强制参数。可选的第一个参数是以逗号分隔的选项列表。支持以下项目:

  • force:重新下载数据集,绕过缓存(当电子表格发生变化时很方便),
  • center, left, right:所有列的对齐方式,默认:left
  • dump:将生成的Latex代码写入终端(方便调试)。

因此,

\googlespreadsheet [center] {https://example.com/csv}

将导致所有单元格居中;并且

\googlespreadsheet [dump,force] {https://example.com/csv}

将触发数据更新并在标准输出上显示标记。

对 Luaotfload 的依赖

请注意,建议加载spreadsheet.lua luaotfload(或fontspec)。它无需加载即可工作luaotfload,但包本身必须存在于中,texmf以便我们能够访问缓存例程。

结语

由于我不使用 Google Docs,因此仅使用您的示例链接测试了代码。虽然它似乎可以工作,但 HTTP 部分是一个临时解决方案,可能会因为 Google 方面的更改而随时中断。可以使用具有内置重定向处理功能的其他 SSl 库来缓解此问题。但是,我已经对几个 已知的加密库 对于 Lua 来说,除了 Luasec 之外,它们要么不适用于 5.2 版本,要么缺乏必要的功能(TLS)。

另一种可能是使用 电子表格 API。虽然这种方法有望提供长期可靠的解决方案,但坦率地说,考虑到 CSV 转储已经足够,我实在太懒了,不想再熟悉另一堆 API 方法。

答案2

ConTeXt 的一个优点是,所有接受文件名的命令也适用于远程文件(请参阅此博客文章给出了一些细节)。但是,这不适用于 Google 使用的 HTTP 重定向。如果您使用任何其他直接提供该文件的服务,则无需额外的代码。以下示例使用 github 提供该文件:

\usemodule[database]

\defineseparatedlist[CSV]
  [separator=comma,
   before=\bTABLE, after=\eTABLE,
   first=\bTR, last=\eTR,
   left=\bTD, right=\eTD]

\starttext

Raw file \crlf
\typefile{https://gist.github.com/adityam/15b673e8a73836018fba/raw/1e2b54e139c8871f05867db1c2ffd1729e3e4129/test.csv}

Parsed file \crlf
\processdatabasefile[CSV][https://gist.github.com/adityam/15b673e8a73836018fba/raw/1e2b54e139c8871f05867db1c2ffd1729e3e4129/test.csv]

\stoptext

给出

在此处输入图片描述

相关内容