Latex:在 Latex 命令中拆分/处理字符串

Latex:在 Latex 命令中拆分/处理字符串

假设我有

\ingredients
{%
    \unit[375]{g} & Farina 00\\
    \unit[250]{g} & Burro\\
    \unit[3]{g} & Sale\\
    1 & Limone
}

(你懂我的意思:我正在处理 xcookybooky)我想写一个新命令

\myIngredients
{%
    \unit[375]{g} & Farina 00\\
    \unit[250]{g} & Burro\\
    \unit[3]{g} & Sale\\
    1 & Limone
}

以便我得到

\ingredients
{%
    \unit[375]{g} & \Index{Farina 00}\\
    \unit[250]{g} & \Index{Burro}\\
    \unit[3]{g} & \Index{Sale}\\
    1 & \Index{Limone}
}

使用 Latex (尽量不要使用纯 Tex) 的最佳方法是什么?我查看了 xstring 和 stringstring,但没有发现任何有用的东西。

我有能力并且也愿意使用正则表达式,但是,我再次没有找到合适的东西。

任何以文献形式提供的帮助或使用乳胶分割和处理复杂字符串的通用方法的链接都将不胜感激。

PS:底层 \ingredients 命令定义为

\newcommand*{\ingredients}[1]
{%
\def\xcb@ingredients
{%
 \vspace{-1em} % same height of ingredients and preparation
 \xcb@name@inghead
 %\\[4pt]
 \\[1em]
 \xcb@fontsize@ing\color{\xcb@color@ing}
 \begin{tabularx}{\xcb@ingredientswidth}{rX}
     ##1
 \end{tabularx}
 }
}

答案1

您可以逐个检查项目并发出适当的\index命令表格已编好。

\documentclass{article}

\usepackage[paperheight=6cm,bottom=2cm]{geometry} % just for the example

\usepackage{tabularx,imakeidx,siunitx}

\makeindex

% a provisional definition of \ingredients, just for the example    
\newcommand*{\ingredients}[1]{%
  \noindent
  \begin{tabularx}{\linewidth}{rX}
  #1
  \end{tabularx}
  \par\bigskip
}

\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\ingredientsidx}{m}
 {
  \massi_ingredients:n { #1 } % this makes the index entries
  \ingredients { #1 }
 }

\seq_new:N \l_massi_ingredients_rows_seq
\seq_new:N \l_massi_ingredients_onerow_seq
\tl_new:N \l_massi_ingredients_item_tl

\cs_new_protected:Npn \massi_ingredients:n #1
 {
  % split the input line by line
  \seq_set_split:Nnn \l_massi_ingredients_rows_seq { \\ } { #1 }
  % get each ingredient
  \seq_map_inline:Nn \l_massi_ingredients_rows_seq
   {
    % split at &
    \seq_set_split:Nnn \l_massi_ingredients_onerow_seq { & } { ##1 }
    % get the second item in the sequence, removing spaces on either side
    \tl_set:Nx \l_massi_ingredients_item_tl
     {
      \exp_not:N \index { \tl_trim_spaces:f { \seq_item:Nn \l_massi_ingredients_onerow_seq { 2 } } }
     }
    % now use the item (already set in an \index entry)
    \tl_use:N \l_massi_ingredients_item_tl
   }
 }

\cs_generate_variant:Nn \tl_trim_spaces:n { f }

\ExplSyntaxOff

\begin{document}

\ingredientsidx{
  \SI{375}{g} & Farina 00\\
  \SI{250}{g} & Burro\\
  \SI{3}{g} & Sale\\
  1 & Limone
}

\printindex

\end{document}

在此处输入图片描述

不要对单位使用较旧的软件包:因为siunitx您已经拥有许多花哨的附加功能。

相关内容