将宏中的第一个单词设为粗体

将宏中的第一个单词设为粗体

我有以下用例:

\cmd{cp \opt{r} \marg{from} \marg{to}}

这应该排版手册的 UNIX 命令。我希望实际命令(此处为cp)以粗体排版,而命令行的其余部分则以正常排版。现在,我显然可以编写类似以下几行的代码:

\cmd{\textbf{cp} \opt{r} \marg{from} \marg{to}}

…但我更希望这可以自动实现。我想到两种方法,但都行不通:

  1. 使所有内容变为粗体,取消嵌套命令的粗体:

    \newcommand*\cmd[1]{%
        \texttt{\textbf{#1}}
    }
    \newcommand*\opt[1]{%
        \undobf{-#1}
    }
    

    …问题:\undobf看起来会是什么样子?\textrm在这里不合适,因为我需要保留tt风格。

  2. 定义一个在其参数中包含空格的 TeX 命令:

    \newcommand*\cmd[1]{%
        \texttt{\setcmd#1}
    }
    \def\setcmd#1 #2{%
        \textbf{#1} #2
    }
    

    但这根本不起作用,可能是因为我搞砸了语法。但即使语法修复了,在我没有为命令提供参数/选项的情况下(例如\cmd{pwd}),这仍然不起作用。

答案1

可以使用常见的 TeX/LaTeX 编程来判断第一个单词后面是否有内容,然后选择正确的分支。

使用 LaTeX3 函数会变得容易得多:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{tgcursor} % clone of Courier

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\cmd}{ m }
 {
  \krudolph_split_cmd:n { #1 }
 }
\cs_new_protected:Npn \krudolph_split_cmd:n #1
 {
  \seq_set_split:Nnn \l__krudolph_cmd_seq { ~ } { #1 }
  \seq_pop_left:NN \l__krudolph_cmd_seq \l__krudolph_cmd_tl
  \group_begin:
  \normalfont\ttfamily
  \textbf{ \l__krudolph_cmd_tl } ~
  \seq_use:Nnnn \l__krudolph_cmd_seq { ~ } { ~ } { ~ }
  \group_end:
 }
\seq_new:N \l__krudolph_cmd_seq
\tl_new:N \l__krudolph_cmd_tl 
\ExplSyntaxOff

% missing definitions
\newcommand{\opt}[1]{-#1}
\newcommand{\marg}[1]{<#1>}


\begin{document}
\cmd{cp \opt{r} \marg{from} \marg{to}}

\cmd{pwd}
\end{document}

参数在空格处被拆分;然后第一个元素被分离并以粗体打印;其余元素以中等粗细打印,并用空格分隔。

在此处输入图片描述

答案2

对于 (2),你的语法是正确的,但是如果你查看日志文件,它可能会说

LaTeX Font Info:    Font shape `T1/cmtt/bx/n' in size <10> not available
(Font)              Font shape `T1/cmtt/m/n' tried instead on input line 18.

也就是说,标准 TeX 字体没有粗体打字机,因此尽管您正确地要求了粗体,但您得到的却是正常粗细。

如果您不想cp使用等宽字体,我认为您可以执行以下操作,只需在用户命令中添加分组并在粗体后切换到 tt:

在此处输入图片描述

\documentclass{article}

\usepackage[T1]{fontenc}

\def\opt#1{{[#1]}}
\def\marg#1{{\char`\{#1\char`\}}}

\newcommand*\cmd[1]{{\setcmd#1 }}

\def\setcmd#1 {%
    \textbf{#1} \ttfamily
}

\begin{document}

\cmd{cp \opt{r} \marg{from} \marg{to}}

\cmd{pwd}

\end{document}

相关内容