将 LaTeX3 脚本转换为 Lua

将 LaTeX3 脚本转换为 Lua

我有一个 LaTeX 文件,我可以从中输出不同语言的不同 PDF。我现在使用的系统运行良好,但它是用 LaTeX3 编写的,我发现很难理解。
这是代码,变量部分作为“多个参数”给出\lc

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[italian,french,english]{babel}

\ExplSyntaxOn

% the main command
\NewExpandableDocumentCommand{\lc}{m} % language choice
 {
  \fabbri_lc:n { #1 }
 }
% we can change the language mid document
\NewDocumentCommand{\setlclanguage}{m}
 {
  \fabbri_lc_set:n { #1 }
 }

% variables
\str_new:N \l_fabbri_lc_lang_str
\str_new:N \l_fabbri_lc_fallback_str

% internal functions
\cs_new:Nn \fabbri_lc:n
 {
  \str_case:VnF \l_fabbri_lc_lang_str
    { #1 }
    { \str_case:Vn \l_fabbri_lc_fallback_str { #1 } }
 }

\cs_new_protected:Nn \fabbri_lc_set:n
 {
  \str_set:Nn \l_fabbri_lc_lang_str { #1 }
  \fabbri_lc:n
   {
    {ita}{\selectlanguage{italian}}
    {fra}{\selectlanguage{french}}
    {eng}{\selectlanguage{english}}
   }
 }
\cs_generate_variant:Nn \fabbri_lc_set:n { e }


% setup
% set the default language based on \jobname of the form <name>-<lang>
\seq_set_split:NnV \l_tmpa_seq { - } \c_sys_jobname_str
\fabbri_lc_set:e { \seq_item:Nn \l_tmpa_seq { 2 } }

% set the fallback language
\str_set:Nn \l_fabbri_lc_fallback_str { eng } % choose the fallback language

\ExplSyntaxOff

\begin{document}

\section{\lc{
  {ita}{Titolo}
  {fra}{Titre}
  {eng}{Title}
}}

\lc{
 {ita}{Questo documento è in italiano}
 {fra}{Ce document est in français}
 {eng}{This document is in English}
}

% French is missing here
\lc{
  {ita}{Testo}
  {eng}{Text}
}

% change the default language
\setlclanguage{fra}

\section{\lc{
  {ita}{Titolo}
  {fra}{Titre}
  {eng}{Title}
}}

\lc{
 {ita}{Questo documento è in italiano}
 {fra}{Ce document est in français}
 {eng}{This document is in English}
}

% French is missing here
\lc{
  {ita}{Testo}
  {eng}{Text}
}

\end{document}

可以根据作业名称选择语言。主文件已命名,fabbri.tex并且 PDF 是使用 pdflatex 用以下命令创建的:

pdflatex -jobname=fabbri-ita fabbri
pdflatex -jobname=fabbri-eng fabbri

我从以下地址获取了上述代码这里

我最近更新了我的设置以使用 LuaLaTeX,并且我想要:

  1. 将上面的代码从“内联”LaTeX3 更改为包含在单独文件中的 Lua 代码。
  2. 更改整个文档的语言,以便命令\today以所选语言打印日期。

不幸的是,在我看来,关于如何将 Lua 与 LaTeX 结合使用的文档并不多,我真的不知道从哪里开始。

答案1

我不会为您转换完整的脚本,但希望以下内容足以帮助您入门。

要从文档的 LaTeX 部分运行 Lua 代码,您可以使用\directlua以要运行的 Lua 代码为参数的宏。这可以是一行代码,也可以是对您定义的函数的调用。

定义函数可以在环境内部完成luacode,通常在序言中。

要在文档中使用 Lua 代码的结果,通常需要tex.sprint()在代码中添加一个命令,该命令是特定于 LuaLaTeX 的命令(即,它在常规 Lua 中不存在),它会在文档中打印参数。

要将关联数组传递给 Lua 代码,您可以使用这种“表”的常规 Lua 语法,因为它被称为参数\directlua

最后,\jobname有一个特殊变量tex.jobname可供在 Lua 代码中使用。

梅威瑟:

\documentclass{article}
\usepackage{luacode}
\begin{luacode}
function llc(langmap)
   local currlang = string.sub(tex.jobname, -3)
   tex.sprint(langmap[currlang])
end
\end{luacode}
\newcommand{\lc}[1]{\directlua{llc(#1)}}
\begin{document}
Jobname: \jobname

\lc{{ita="Questo documento è in italiano",
    fra="Ce document est in français",
    eng="This document is in English"}}
\end{document}

结果为lualatex -jobname=fabbri-fra yourfile.tex

在此处输入图片描述

答案2

无需使用 expl3 或 lua 脚本。仅使用 TeX 原语即可实现您的意图:

\def\sdef#1{\expandafter\def\csname #1\endcsname}
\def\trycs#1#2{\ifcsname #1\endcsname \csname #1\endcsname \else #2\fi}
\def\readlanguage #1-#2;{\def\langmark{#2}}
\def\langmark{eng} % default language
%\expandafter\readlanguage \jobname;  % read \langmark from jobname

\sdef{sel:ita}{\selectlanguage{italian}\def\lcset{1}\sdef{use:ita}{1}}
\sdef{sel:fra}{\selectlanguage{french}\def\lcset{2}\sdef{use:fra}{2}}
\sdef{sel:eng}{\selectlanguage{english}\def\lcset{3}\sdef{use:eng}{3}}

\def\lc#1{\lcA#1{}{}}
\def\lcA#1#2{%
   \ifnum\lcset=\trycs{use:#1}{0} #2\fi
   \ifx&#1&\else \expandafter\lcA \fi
}

\trycs{sel:\langmark}{} % select a language given by \langmark

% test:
\lc{
 {ita}{Questo documento è in italiano}
 {fra}{Ce document est in français}
 {eng}{This document is in English}
}

第 4 行定义了默认语言eng。如果您想\langmark从中读取,请从第 5 行中删除注释字符,即当您在命令行中\jobname使用时。-jobname file-fra file

相关内容