如果我想在 LaTeX3 中存储查找表,有什么比 l3prop 更好的方法吗?

如果我想在 LaTeX3 中存储查找表,有什么比 l3prop 更好的方法吗?

正如所述我如何正确扩展 \prop_item:Nn 的结果以使用我自己的 \DoSomething 函数?我目前正在研究一个需要在 LaTeX 中使用查找功能的主题。基本上,我有一个可以通过三个级别访问的信息,我想让用户选择使用每个级别来访问该信息。到目前为止,我有三个功能,一个允许直接访问级别 1。一个允许通过级别 2 进行访问并在级别 1 上查找相应的信息。后者对级别 3 执行相同的操作。

但是现在我想要多个函数来访问信息,因此我将数据与函数分开,这就是另一个问题中描述的问题出现的地方。但由于我的 prop 现在有 2200 个项目,因此 prop 中的查找比使用 case 比较函数花费的时间大约是 3 倍,即使我使用的是 const l3prop:

prop_const_from_keyval:Nn \l_tobisbs_lookup_prop
{
    {key1} = {value1},
    {key2} = {value2},
}

因此,我猜测文档中的评论,即这不是适合此目的的数据类型是正确的,但是什么是一个好的数据类型或通用解决方案来存储这种类型的信息并在 LaTeX3 中的多个函数中使用它?

答案1

我不知道这是否会更快,但如果数据库确实非常庞大,您可能可以在 MySQL 或 MariaDB 服务器中组织它。

然后,您可以使用 LuaLaTeX 和“--shell-escape”并通过assert调用命令行 SQL 客户端从数据库中检索值作为字符串。字符串反过来可以写入 TeX 级别。如果字符串仅包含应标记为字符标记的内容,或者如果您不介意依赖类别代码为 0 的反斜杠,则您可能可以使用tex.sprint以下方法:

\documentclass{article}
\usepackage{verbatim}

\makeatletter
\let\percentchar=\@percentchar
\makeatother

\newcommand\CallExterrnal[1]{%
  \directlua{ 
    function runcommand(cmd) 
    local fout = assert(io.popen(cmd, 'r')) 
    local str = assert(fout:read('*a')) 
    fout:close() 
    return str 
    end 
    tex.sprint (runcommand("#1"))
  }%
}%

\begin{document}

% Instead of the echo-command a commandline-SQL/MariaDB-client
% could be called for retrieving values of a database.

Let's catch the output of \verb|echo \\LaTeX| between parentheses:

(\CallExterrnal{echo \string\\\string\\LaTeX\percentchar})

Let's catch the output of \verb|echo \LaTeX| into a macro definition:

\expandafter\expandafter\expandafter\def
\expandafter\expandafter\expandafter\test
\expandafter\expandafter\expandafter{%
  \CallExterrnal{echo \string\\\string\\LaTeX\percentchar}%
}

\texttt{(\string\test=\meaning\test)}

\end{document}

在此处输入图片描述

您可能需要将命令行 SQL 客户端添加shell_escape_commands =texmf配置文件


也许另一种方法可能是针织品从 .rnw 文件或 .Rtex 文件中为你创建 .tex 文件,其中 R 代码和 TeX 代码合并,并且你拥有 R 代码块,用于调用本地命令行 SQL 客户端,从数据库中检索值并将它们放入 .tex 文件中。(knitr 开箱即用背面如果文件名为 .Rtex.

<<templates, include=FALSE, cache=FALSE, echo=FALSE, results='asis'>>=
knitr::opts_template$set(
  CallExternalApp = list(include=TRUE, cache=FALSE, echo=FALSE, results='asis')
)
@
<<CallExternal, include=TRUE, cache=FALSE, echo=FALSE, results='asis', >>=
CallExternalApp <- function(A) {
    return(cat(system(A, intern = TRUE), sep="", fill=FALSE))
}
@

\documentclass{article}

\begin{document}

Instead of calling \verb|echo| there could probably be a call to a commandline-SQL -client.

\bigskip

In Linux with the \verb|echo|-command you need to escape backslash, i.e., you need to type
two backslashes to get one. Same for R-code-chunks. Thus if you wish R to send an
\verb|echo|-command that produces a backslash, you need to type four backslashes.

\bigskip

Let's catch the output of \verb|echo \\LaTeX| between parentheses:

(%
<<, opts.label='CallExternalApp' >>= 
<<CallExternal>>
CallExternalApp("echo \\\\LaTeX\\%")
@
)

\bigskip

Let's catch the output of \verb|echo \\LaTeX| into a macro definition:

\def\test{%
<<, opts.label='CallExternalApp' >>= 
<<CallExternal>>
CallExternalApp("echo \\\\LaTeX\\%")
@
}

\texttt{(\string\test=\meaning\test)}


\end{document}

在此处输入图片描述

相关内容