
ОБНОВЛЕНИЕ: Я задал дополнительный вопрос:Как мне набрать окружение и его буквальный эквивалент в окружении?
Я хотел бы передать команду и аргументы в среду. Вывод должен быть трехчастным:
- Буквальная команда
- Набранная версия (как она должна выглядеть при использовании)
- Определение команды. (Это просто текстовое описание того, для чего используется команда.)
Моя попытка
Для этого примера я попробую использовать \key
команду, предоставленнуюmenukeys
упаковка.
\documentclass{article}
\usepackage{fontspec}
\usepackage{environ}
\usepackage{marginnote}
\usepackage{menukeys}
\NewEnviron{command}[1]{%
\par
\reversemarginpar\marginnote{\texttt{\string#1}}
\BODY
\par
\textbf{Example:} % And here is #1 with #2, but literally typeset (e.g. literally \keys{Shift + F5})
\par
%#1#2 % <-- I'd like to typeset these two inputs properly (e.g. non-literal \keys{Shift + F5})
\par
}%
\begin{document}
\begin{command}{\keys}% {{Shift + F5}} % Example input does not work
This command allows you to add keyboard strokes. % here is the definition followed by an example on the next line.
\end{command}
\end{document}
Желаемый результат
Мои мысли
Может быть, это даже не правильный подход. Я не знаю, как эффективно работать с командами с несколькими аргументами (например, созданными с помощью пакета xparse
).
решение1
Вам следует дословно усвоить два аргумента, что xparse
позволяет это сделать; затем вы можете «пересканировать» два аргумента, когда захотите продемонстрировать эффект.
\documentclass{article}
\usepackage{fontspec}
\usepackage{menukeys}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentEnvironment{command}{vv}
{
\tl_set:Nn \l_macmad_argument_i_tl { #1 }
\tl_set:Nn \l_macmad_argument_ii_tl { #2 }
\par
\noindent
\makebox[0pt][r]{\ttfamily\l_macmad_argument_i_tl\hspace{2em}}
\ignorespaces
}
{
\par\nopagebreak
\noindent
\textbf{Example:~}
\texttt
{
\l_macmad_argument_i_tl
\tl_if_blank:VF \l_macmad_argument_ii_tl
{ \{ \l_macmad_argument_ii_tl \} }
}
\\*
\tl_set_rescan:NnV \l_macmad_argument_tl {} \l_macmad_argument_i_tl
\tl_if_blank:VF \l_macmad_argument_ii_tl
{
\tl_set_rescan:NnV \l_macmad_temp_tl {} \l_macmad_argument_ii_tl
\tl_put_right:Nx \l_macmad_argument_tl { { \exp_not:V \l_macmad_temp_tl } }
}
\l_macmad_argument_tl
\par
}
\tl_new:N \l_macmad_argument_tl
\tl_new:N \l_macmad_argument_i_tl
\tl_new:N \l_macmad_argument_ii_tl
\tl_new:N \l_macmad_temp_tl
\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV }
\ExplSyntaxOff
\begin{document}
\begin{command}{\keys}{Shift + F5}
This command allows you to add keyboard strokes.
\end{command}
\begin{command}{\TeX}{}
This command prints the \TeX\ logo.
\end{command}
\begin{command}{\textbf}{\TeX}
This command prints its argument in bold.
\end{command}
\end{document}
Вы можете указать более одного аргумента, но в этом случае вам необходимо использовать фигурные скобки для обязательных аргументов, даже если есть только один из них.
\documentclass{article}
\usepackage{fontspec}
\usepackage{menukeys}
\usepackage{xparse} % but it's already loaded by fontspec
\ExplSyntaxOn
% "v" means "verbatim argument"
\NewDocumentEnvironment{command}{vv}
{
% store the two arguments in variables
% xparse has absorbed them "verbatim"
\tl_set:Nn \l_macmad_argument_i_tl { #1 }
\tl_set:Nn \l_macmad_argument_ii_tl { #2 }
\par
\noindent
% print the first argument in the margin
\makebox[0pt][r]{\ttfamily\l_macmad_argument_i_tl\hspace{2em}}
\ignorespaces
}
{
\par\nopagebreak
\noindent
\textbf{Example:~}
\texttt
{
% print the first argument
\l_macmad_argument_i_tl
% print the second argument (but only if non empty)
\tl_if_blank:VF \l_macmad_argument_ii_tl
{ \l_macmad_argument_ii_tl }
}
\\*
% transform back the first argument from verbatim into "standard tokens"
\tl_set_rescan:NnV \l_macmad_argument_tl {} \l_macmad_argument_i_tl
\tl_if_blank:VF \l_macmad_argument_ii_tl
{
% do the same for the second argument (if non empty)
\tl_set_rescan:NnV \l_macmad_temp_tl {} \l_macmad_argument_ii_tl
% append the rescanned text to the previous
\tl_put_right:Nx \l_macmad_argument_tl { \exp_not:V \l_macmad_temp_tl }
}
% process the contents of the rescanned arguments
\l_macmad_argument_tl
\par
}
% allocate the variables
\tl_new:N \l_macmad_argument_tl
\tl_new:N \l_macmad_argument_i_tl
\tl_new:N \l_macmad_argument_ii_tl
\tl_new:N \l_macmad_temp_tl
% generate a variant command
\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV }
\ExplSyntaxOff
\begin{document}
\begin{command}{\keys}{{Shift + F5}}
This command allows you to add keyboard strokes.
\end{command}
\begin{command}{\TeX}{}
This command prints the \TeX\ logo.
\end{command}
\begin{command}{\textbf}{{\TeX}}
This command prints its argument in bold.
\end{command}
\begin{command}{\framebox}{[3cm][l]{\TeX}}
This command frames text in a specified area.
\end{command}
\end{document}
решение2
Это не совсем то, что вы просили, но может быть кому-то полезно. Преимущество в том, чтоtcolorboxПакет может печатать код LaTeX и результат этого кода в среде с большим количеством опций.
\documentclass{article}
\usepackage[most]{tcolorbox}
\usepackage{menukeys}
\newtcblisting{command}{sidebyside,width=.55\linewidth,nobeforeafter,baseline=5mm,lefthand ratio=0.65}
\parskip1em
\begin{document}
Print the \TeX\ logo \dotfill \begin{command}\TeX\end{command}
Add keyboard strokes \dotfill \begin{command}\keys{Shift + F5}\end{command}
Print argument in bold \dotfill \begin{command}\textbf{\TeX}\end{command}
\end{document}
Редактировать:
Еще одно жесткое, но простое решение — это упаковкапример:
\documentclass[a5paper]{article}
\usepackage{menukeys,example,lipsum}
\parindent0in\parskip1em
\begin{document}
This command allows you to add keyboard strokes.%
\begin{example}
\keys{Shift + F5}
\end{example}
This command prints the \TeX\ logo.
\begin{example}
\TeX
\end{example}
This command prints its argument in bold.
\begin{example}
\textbf{\TeX}
\end{example}
This print a boxed dummy text.
\begin{example}
\fbox{\begin{minipage}{4cm}
\raggedright
\tiny\lipsum[2]
\end{minipage}}
\end{example}
\end{document}
решение3
Это должно делать то, что нужно, и также позволяет использовать несколько аргументов. Единственная проблема в том, что если во втором аргументе есть управляющие последовательности, они добавляются с пробелом.
\documentclass{article}
\usepackage{fontspec}
\usepackage{environ}
\usepackage{marginnote}
\usepackage{menukeys}
\NewEnviron{command}[2]{%
\par
\reversemarginpar\marginnote{\texttt{\string#1}}
\BODY
\par
\textbf{Example:}
\texttt{\string#1\detokenize{#2}}
\par
#1#2
\par
}%
\begin{document}
\begin{command}{\keys}{{Shift + F5}}
This command allows you to add keyboard strokes.
\end{command}
\begin{command}{\TeX}{}
This command prints the \TeX\ logo.
\end{command}
\begin{command}{\textbf}{{\TeX}}
This command prints its argument in bold.
\end{command}
\begin{command}{\rule}{[-2pt]{1em}{1em}}
This command print a black box.
\end{command}
\end{document}