多语言文本

多语言文本

我正在用 LaTeX 编写我的简历,现在我有下面的代码,我用它创建两个命令\eng{}\ita{}它允许我隐藏我不想要的语言的文本。

%% English %%
\newtoggle{eng}
\newcommand{\eng}[1]{\iftoggle{eng}{#1}{}}

\ifthenelse{\equal{\detokenize{cv}}{\jobname}}{
  \toggletrue{eng}
}{
  \togglefalse{eng}
}

%% Italian %%
\newtoggle{ita}
\newcommand{\ita}[1]{\iftoggle{ita}{#1}{}}

\ifthenelse{\equal{\detokenize{cv-ita}}{\jobname}}{
  \toggletrue{ita}
}{
  \togglefalse{ita}
}

这些切换是根据命令行上的参数设置的,如果没有传递参数,则只保留英语,如果命令行如下所示:

pdflatex -jobname=cv-ita cv

那么命令内的所有内容\eng{}都会被隐藏,只留下意大利语。

我希望改进这一点,这样如果没有意大利语文本,就可以使用英语文本。不幸的是,用 TeX 编程对我来说相当困难。

你有什么建议吗?

更新 1

这就是我目前使用上面定义的命令的方式:

\cvsection{ \eng{EDUCATION}
            \ita{FORMAZIONE}}

问题是,如果我只有\eng{EDUCATION}并且使用标志调用编译器,ita我会得到一个错误,因为里面没有文本\cvsection。我希望命令返回到英文文本,而不是得到错误。

我认为实现此目的的最佳方法是定义一个新命令,例如:

\lan{English text}{Italian text}

当没有意大利语文本时,默认为英语。可以吗?

答案1

您可以根据作业名称选择语言。我调用了主文件fabbri.tex,然后通过以下方式调用 LaTeX

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

以下是代码;变量部分作为“多个参数”传递给\lc。当然,从\ExplSyntaxOn到 的部分\ExplSyntaxOff可以放在lcsetup.tex文件中\input

\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}

输出ita

在此处输入图片描述

输出eng

在此处输入图片描述

答案2

这能达到你想要的效果吗?

\documentclass{article}

\usepackage{etoolbox}

\newtoggle{ita}
\toggletrue{ita}

\newcommand\lan[2]{%
  \ifboolexpe{
    (not togl {ita}) or test{\ifstrempty{#2}}
  }{#1}{#2}%
}

\begin{document}

\lan{English}{Italian}

\lan{Only English}{}

\end{document}

请注意,我甚至没有为英语版本定义切换按钮,只有“意大利语或非意大利语”。

编辑:按照评论的要求,考虑三种语言(虽然不是非常优雅的代码,但它有效):

\documentclass{article}

\usepackage{etoolbox}

\newtoggle{ita}
\newtoggle{swe}

\newcommand\lan[3]{%
  \ifboolexpe {test{\ifstrempty{#2}} or not togl{ita}}
    {%
        \ifboolexpe {test{\ifstrempty{#3}} or not togl{swe}}
            {#1}
            {#3}%
    }
    {#2}%
}

\begin{document}

\textbf{English:}\par
\lan{English}{Italian}{Swedish}\par
\lan{English}{Italian}{}\par
\lan{English}{}{Swedish}\par
\lan{English}{}{}\par

\textbf{Swedish:}\par
\toggletrue{swe}
\lan{English}{Italian}{Swedish}\par
\lan{English}{Italian}{}\par
\lan{English}{}{Swedish}\par
\lan{English}{}{}\par

\textbf{Italian:}\par
\toggletrue{ita}
\togglefalse{swe}
\lan{English}{Italian}{Swedish}\par
\lan{English}{Italian}{}\par
\lan{English}{}{Swedish}\par
\lan{English}{}{}\par

\end{document}

相关内容