如何将 \ifdefstring (etoolbox) 与 \multicolumn 结合使用

如何将 \ifdefstring (etoolbox) 与 \multicolumn 结合使用

我需要制作带有挪威语或英语列标题的表格,标题位于数字上方。我定义了一个命令,\ReportLanguage,可以将其设置为两个值中的任意一个,no挪威语为“ ”,en英语为“ ”。然后,将此语言选择命令与 etoolbox 函数结合使用\ifdefstring,以在表格内容上方切换挪威语和英语标题文本。此语言切换函数如下所示:

\documentclass[10pt,a4paper,twosided]{article}
\usepackage{etoolbox}
\usepackage{booktabs}

\newcommand{\ReportLanguage}{en}
% two alternative values for \ReportLanguage: 
% "no" for norwegian and "en" for english

    \begin{document} 
    \begin{tabular}{ccc}
          \ifdefstring{\ReportLanguage}{no}%
              {Dybde & temperatur & Salinitet  \\}
              {Depth & temperature  & Salinity  \\}                           
                \midrule
                100 & 10 & 32 \\
                150 & 7  & 33 \\            
                180 & 4  & 35 \\
                \bottomrule
    \end{tabular}
    \end{document}

这对于 \ReportLanguage 变量的两个值都可以正常工作,并且当 \ReportLanguage 设置为值“en”时会给出以下编译结果。

在此处输入图片描述

但是,我希望在前两个标题“深度”和“温度”标题上方有一个共同的标题。我尝试在语言切换函数\multicolumn中使用该函数\ifdefstring,但收到错误消息。代码如下所示:

\documentclass[10pt,a4paper,twosided]{article}
\usepackage{etoolbox}
\usepackage{booktabs}

\newcommand{\ReportLanguage}{no}
% two alternative values for \ReportLanguage: 
% "no" for norwegian and "en" for english

\begin{document}
\begin{tabular}{ccc}
      \ifdefstring{\ReportLanguage}{no}%
          {\multicolumn{2}{c}{Utslippspunkt} & Salinitet  \\       
             Dybde & temperatur                &             \\}
          {\multicolumn{2}{c}{Release point}  & Salinity  \\                           
            Depth & temperature                &            \\}
            \midrule
            100 & 10 & 32 \\
            150 & 7  & 33 \\            
            180 & 4  & 35 \\
            \bottomrule
\end{tabular}
\end{document}

错误消息如下:

在此处输入图片描述

我的代码有什么问题?如果能得到这方面的帮助,我将不胜感激,先行致谢!

答案1

问题\ifdefstring可扩展,因此它不能在表格的这个地方使用。你可以通过使用低级来克服这个问题\ifx

\documentclass[10pt,a4paper,twoside]{article}
\usepackage{etoolbox}
\usepackage{booktabs}

\newcommand{\ReportLanguage}{no}
% two alternative values for \ReportLanguage: 
% "no" for norwegian and "en" for english
\newcommand{\NorwegianLanguage}{no}

\begin{document}
\begin{tabular}{ccc}
      \ifx\ReportLanguage\NorwegianLanguage
          \multicolumn{2}{c}{Utslippspunkt} & Salinitet  \\       
             Dybde & temperatur                &             \\
      \else
          \multicolumn{2}{c}{Release point}  & Salinity  \\                           
            Depth & temperature                &            \\
      \fi
            \midrule
            100 & 10 & 32 \\
            150 & 7  & 33 \\            
            180 & 4  & 35 \\
            \bottomrule
\end{tabular}
\end{document}

在表格单元格/行的开头,LaTeX 会查找诸如 等内容\multicolumn\hline当您在此处放置不可扩展的内容时,LaTeX 会停止查找这些内容。如果稍后找到它们(例如您的\multicolumn),LaTeX 会感到困惑并抛出错误。

只是一句:我想你想要的twosidetwosided(也许两者都有效,我不知道,我总是使用第一个)。


如果你不想定义\NorwegianLanguage,你可以这样做(使用风险自负):

\documentclass[10pt,a4paper,twosided]{article}
\usepackage{etoolbox}
\usepackage{booktabs}

\newcommand{\ReportLanguage}{no}
% two alternative values for \ReportLanguage: 
% "no" for norwegian and "en" for english

\begin{document}
\begin{tabular}{ccc}
      \expandafter\ifx\csname\ReportLanguage LANGUAGE\endcsname\noLANGUAGE
          \multicolumn{2}{c}{Utslippspunkt} & Salinitet  \\       
             Dybde & temperatur                &             \\
      \else
          \multicolumn{2}{c}{Release point}  & Salinity  \\                           
            Depth & temperature                &            \\
      \fi
            \midrule
            100 & 10 & 32 \\
            150 & 7  & 33 \\            
            180 & 4  & 35 \\
            \bottomrule
\end{tabular}
\end{document}

答案2

我会使用一种更加用户友好的方法:你发出一个\TableHeader命令,其中包含你想要的下一个表的标题的键值列表,然后在表中放置\UseTableHeader

在示例中,我切换语言(您可能不想在真实文档中这样做)只是为了显示结果;请注意,作为参数给出的值将一直\TableHeader存在,直到\TableHeader再次发出另一个值。

\documentclass[10pt,a4paper,twoside]{article}
\usepackage{booktabs}
\usepackage{keyval}

\makeatletter
\define@key{espentable}{no}{\def\espen@header@no{#1}}
\define@key{espentable}{en}{\def\espen@header@en{#1}}

\newcommand{\TableHeader}[1]{%
  \setkeys{espentable}{#1}%
  \ignorespaces
}
\newcommand{\UseTableHeader}{\@nameuse{espen@header@\espen@language}}

% two alternative values for \ReportLanguage: 
% "no" for norwegian and "en" for english
\newcommand{\ReportLanguage}[1]{\def\espen@language{#1}}
\def\espen@language{en}% default
\makeatother

\ReportLanguage{no}

\begin{document}

Norsk:

\TableHeader{
  no={\multicolumn{2}{c}{Utslippspunkt} & Salinitet \\
      Dybde & temperatur                &           \\},
  en={\multicolumn{2}{c}{Release point}  & Salinity \\                           
      Depth & temperature                &          \\}
}
\begin{tabular}{ccc}
\toprule
\UseTableHeader
\midrule
100 & 10 & 32 \\
150 & 7  & 33 \\            
180 & 4  & 35 \\
\bottomrule
\end{tabular}

\bigskip

English:

\ReportLanguage{en}
\begin{tabular}{ccc}
\toprule
\UseTableHeader
\midrule
100 & 10 & 32 \\
150 & 7  & 33 \\            
180 & 4  & 35 \\
\bottomrule
\end{tabular}

\end{document}

这样做的好处是它可以轻松扩展到两种以上的语言。

在此处输入图片描述

相关内容