
UPDATE: Ich habe eine Folgefrage eröffnet:Wie kann ich eine Umgebung und ihr wörtliches Äquivalent in einer Umgebung setzen?
Ich möchte einen Befehl und Argumente an eine Umgebung übergeben. Die Ausgabe sollte dreigeteilt sein:
- Der wörtliche Befehl
- Die gesetzte Version (wie sie bei Verwendung aussehen soll)
- Die Definition des Befehls. (Dies ist lediglich eine Textbeschreibung dessen, wofür der Befehl verwendet wird.)
Mein Versuch
Für dieses Beispiel versuche ich den \key
Befehl zu verwenden, der von dermenukeys
Paket.
\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}
Gewünschte Ausgabe
Meine Gedanken
Vielleicht ist das nicht einmal der richtige Ansatz. Ich weiß nicht, wie ich die Befehle mit mehreren Argumenten effizient verarbeiten kann (z. B. mit dem xparse
Paket erstellt).
Antwort1
Sie sollten die beiden Argumente wörtlich aufnehmen, was xparse
möglich ist; anschließend können Sie die beiden Argumente „erneut scannen“, wenn Sie die Wirkung zeigen möchten.
\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}
Sie können mehr als ein Argument angeben, in diesem Fall müssen Sie für die obligatorischen Argumente jedoch Klammern verwenden, auch wenn nur eines vorhanden ist.
\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}
Antwort2
Ist nicht genau das, was Sie gefragt haben, aber vielleicht ist es für jemanden nützlich. Der Vorteil ist, dass dieAbonnierenDas Paket kann den LaTeX-Code und das Ergebnis dieses Codes in einer Umgebung mit vielen Optionen drucken.
\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}
Bearbeiten:
Eine weitere starre, aber einfache Lösung ist das PaketBeispiel:
\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}
Antwort3
Dies sollte das gewünschte Ergebnis liefern und erlaubt auch mehrere Argumente. Das einzige Problem ist, dass Steuersequenzen im zweiten Argument mit einem Leerzeichen angehängt werden.
\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}