我有一个 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,并且我想要:
- 将上面的代码从“内联”LaTeX3 更改为包含在单独文件中的 Lua 代码。
- 更改整个文档的语言,以便命令
\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&\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