我有以下用例:
\cmd{cp \opt{r} \marg{from} \marg{to}}
这应该排版手册的 UNIX 命令。我希望实际命令(此处为cp
)以粗体排版,而命令行的其余部分则以正常排版。现在,我显然可以编写类似以下几行的代码:
\cmd{\textbf{cp} \opt{r} \marg{from} \marg{to}}
…但我更希望这可以自动实现。我想到两种方法,但都行不通:
使所有内容变为粗体,取消嵌套命令的粗体:
\newcommand*\cmd[1]{% \texttt{\textbf{#1}} } \newcommand*\opt[1]{% \undobf{-#1} }
…问题:
\undobf
看起来会是什么样子?\textrm
在这里不合适,因为我需要保留tt
风格。定义一个在其参数中包含空格的 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}