拆分字符串并对每个段(或“单词”)应用操作

拆分字符串并对每个段(或“单词”)应用操作

我目前正在为某个软件写教程,我想参考一下该程序中使用的快捷键。这些快捷键应该很显眼,即以不同的颜色或字体样式显示。

基本上我想做的是创建一个新命令,只有一个参数——一串单词,用一些分隔符分隔(逗号)每个单词(或部分,因为在这种情况下单词将是子字符串,如CtrlShiftEnter只是SO)应以显著样式显示(假设\textbf{}),并且每两个单词之间应该有一个+(或其他符号)使用常规字体样式。请注意,这不一定是参数中使用的相同分隔符(逗号)!

伪代码如下:

\newcommand{\shortcut}[1]{
    For every word in the argument #1:
        - Display in notable font style
        - Add + in regular font style (except for last word)
}

所以\shortcut{Ctrl,Shift,Z}结果应该是\textbf{Ctrl}+\textbf{Shift}+\textbf{Z}

有没有关于使用软件包的推荐,或者可以使用相对简单的 LaTeX 来完成?

答案1

“老式”方法

\makeatletter
\newcommand{\shortcut}[1]{%
  \@tempswafalse
  \@for\next:=#1\do
    {\if@tempswa+\else\@tempswatrue\fi\textbf{\next}}%
}
\makeatother

然后\shortcut{Ctrl,Shift,Z}就会做你想做的事。

“新风格”方法

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\shortcut}{O{,}m}
 {
  \ailurus_make:nn {#1} {#2}
 }

\cs_new_protected:Npn \ailurus_make:nn #1 #2
 {
  \seq_set_split:Nnn \l_ailurus_args_seq { #1 } { #2 }
  \seq_pop_left:NN \l_ailurus_args_seq \l_ailurus_temp_tl
  \textbf { \l_ailurus_temp_tl }
  \seq_map_inline:Nn \l_ailurus_args_seq { + \textbf { ##1 } }
 }

\seq_new:N \l_ailurus_args_seq
\tl_new:N \l_ailurus_temp_tl
\ExplSyntaxOff

\begin{document}
\shortcut{Ctrl,Shift,Z}

\shortcut[/]{Ctrl/,}
\end{document}

它看起来更复杂,但实际上非常相似。输入在逗号处被拆分,然后执行循环。第一个元素被弹出并进行特殊处理(实际上,在这种情况下,处理并不多)。

奖金使用此解决方案,您可以通过选择不同的分隔符作为可选参数,轻松打印逗号。当然也可以

\shortcut{Ctrl,{,}}

可能会有效,但这种策略也可以用于更困难的情况。

答案2

\documentclass{article}

\makeatletter

\def\shortcut#1{{\def\scsep{\def\scsep{+}}\@for\w:=#1\do{\scsep\textbf{\w}}}}
\makeatother

\begin{document}

\shortcut{Ctrl,Shift,Z} 

\end{document}

答案3

... 而且非常短,只使用一个“特殊”宏:)(需要字符串):

\documentclass[10pt,a4paper]{article}

\usepackage{xstring}

\newcommand{\specialtext}[1]{%
    \StrSubstitute{#1}{,}{ + }[\myspecialtext]
    \textbf{\myspecialtext}}

\begin{document}
This is a \specialtext{very,special} command.
\end{document}

在此处输入图片描述

编辑:正如@PeterGrill 指出的那样,这将产生粗体+。为了避免这种情况,正如 OP 的要求(以防万一),应该像这样修改代码,而不会牺牲任何舒适度:

\newcommand{\specialtext}[1]{%
    \noexpandarg    
    \StrSubstitute{#1}{,}{ \textnormal{+} }[\myspecialtext]
    \textbf{\myspecialtext}}

答案4

您可以使用\foreach循环pgffor,它是pgf

在此处输入图片描述

笔记:

  • 我用了etoolbox提供切换来测试第一个元素,但如果需要,应该很容易适应它,不需要该包,使用来自的解决方案LaTeX 条件表达式

代码:

\documentclass{article}
\usepackage{etoolbox}
\usepackage{pgffor}

\newtoggle{FirstShortcut}
\newcommand*{\shortcut}[1]{%
    \global\toggletrue{FirstShortcut}%
    \foreach \member in {#1} {%
        \iftoggle{FirstShortcut}{}{+}%
        \textbf{\member}%
        \global\togglefalse{FirstShortcut}%
    }%
}%

\begin{document}
    \shortcut{Ctrl,Shift,Z}
\end{document}

相关内容