xparse 또는 latex3 구문을 사용하여 [key=value]와 같은 명령을 다시 작성합니다.

xparse 또는 latex3 구문을 사용하여 [key=value]와 같은 명령을 다시 작성합니다.

나는 명령에서 각도, 대괄호 및 텍스트에 사용되는 글꼴 스타일을 색상화하고 결정하기 위해 및를 ltxdoc사용하지 않고 (\oarg,\meta,\marg) 와 같은 일부 명령을 사용하는 매크로를 작성했습니다 . 다음과 같은 형식의 명령을 작성하고 싶습니다.textcompltxdoc

\mycomand[key=value]{...}

하지만 타자기와 로마자에 대한 소스 글꼴 선택 때문에 어려웠습니다. 이것은 파일입니다 (MWE)

% 2015-29-04
\documentclass{article}
\usepackage[T1]{fontenc}%
\usepackage{libertine}%
\usepackage[dvipsnames]{xcolor}
\usepackage{listings}
% Font used for \textangle in \ttfamily
\DeclareFontEncoding{TS1}{}{}
\DeclareFontSubstitution{TS1}{cmr}{m}{n}
\DeclareTextSymbol{\ttlangle}{TS1}{60}
\DeclareTextSymbol{\ttrangle}{TS1}{62}
\DeclareTextSymbolDefault{\ttlangle}{TS1}
\DeclareTextSymbolDefault{\ttrangle}{TS1}
% adapted from doc.dtx    
\providecommand\meta[1]{{\fontfamily{cmr}\fontencoding{TS1}\selectfont\ttlangle\/}\ignorespaces{\normalfont\itshape #1\/}{\fontfamily{cmr}\fontencoding{TS1}\selectfont\/\ttrangle}} % close
% adapted from ltxdoc.dtx
\providecommand\marg[1]{{\fontfamily{cmr}\fontencoding{T1}\selectfont\{\ignorespaces}\normalfont\meta{#1}\ignorespaces{\fontfamily{cmr}\fontencoding{T1}\selectfont\}\ignorespaces}} % close
\providecommand\oarg[1]{{\fontfamily{cmr}\fontencoding{T1}\selectfont [}\normalfont\meta{#1}{\fontfamily{cmr}\fontencoding{T1}\selectfont ]\ignorespaces}} % close
\begin{document}
\noindent
ROMAN

\textlangle\emph{meta}\textrangle \par
[\textlangle\emph{oarg}\textrangle] \par
\{\textlangle\emph{marg}\textrangle\} \par

\noindent
TYPEWRITE 

\meta{meta} \par
\oarg{oarg} \par
\marg{marg} \par

\let\us\textunderscore
\newcommand\placeholder[1]%
{%
    \bgroup
        \normalfont\upshape\color{RubineRed}%
        \textlangle{\itshape #1\/}\textrangle%
    \egroup
}

\lstset
{%
    basicstyle  = \ttfamily,
        escapeinside={<}{>},%
}

\noindent
TEST USING ROMAN 
\begin{lstlisting}
for i= <\placeholder{first\us{}value}>:<\placeholder{last\us{}value}>
    % do stuff
end
\end{lstlisting}

\noindent
TEST USING TYPEWRITER
\begin{lstlisting}
for i= <\meta{first\us{}value}>:<\meta{last\us{}value}>
    % do stuff
end
\end{lstlisting}

TRY

\begin{lstlisting}
\mymeta[type=<\meta{tt,rm}>,cf=<\meta{color font}>,ac=<\meta{angle color}>]{ ... }
\myoarg[type=<\meta{tt,rm}>,cf=<\meta{color font}>,ac=<\meta{angle color}>,sbc=<\meta{square brackets color}>]{ ... }
\mymarg[type=<\meta{tt,rm}>,cf=<\meta{color font}>,ac=<\meta{angle color}>,cbc=<\meta{curly braces color}>]{ ... }
\end{lstlisting}
\end{document}

내 생각은 기본 타이프라이트 글꼴과 모든 것을 검정색으로 두는 것입니다.

편집하다: 키를 정의해 보십시오.

type= text font (tt or rm) (default tt)
cf  = color font (default black)
ac  = angle color (default black)
sbc = square brackets color (default black)
cbc = curly braces color (default black)

그리고 명령

% use \meta
\mymeta[type=tt,cf=red,ac=green}]{ ... }
% use \oarg
\myoarg[type=tt,cf=red,ac=green,sbc=blue]{ ... }
% use \marg
\mymarg[type=tt,cf=red,ac=green,cbc=blue]{ ... }

미리 감사드립니다.

답변1

가능한 구현은 다음과 같습니다.

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
%\usepackage{libertine}
\usepackage[dvipsnames]{xcolor}
\usepackage{xparse}

\ExplSyntaxOn
% user level commands
\NewDocumentCommand{\meta}{O{}m}
 {
  \pablo_meta_generic:Nnn \pablo_meta:n { #1 } { #2 }
 }
\NewDocumentCommand{\marg}{O{}m}
 {
  \pablo_meta_generic:Nnn \pablo_marg:n { #1 } { #2 }
 }
\NewDocumentCommand{\oarg}{O{}m}
 {
  \pablo_meta_generic:Nnn \pablo_oarg:n { #1 } { #2 }
 }

% variables and keys
\tl_new:N \l_pablo_meta_font_tl

\keys_define:nn { pablo/meta }
 {
  type .choice:,
  type / tt .code:n = \tl_set:Nn \l_pablo_meta_font_tl { \ttfamily },
  type / rm .code:n = \tl_set:Nn \l_pablo_meta_font_tl { \rmfamily },
  type .initial:n = tt,
  cf .tl_set:N = \l_pablo_meta_color_tl,
  cf .initial:n = black,
  ac .tl_set:N = \l_pablo_meta_anglecolor_tl,
  ac .initial:n = black,
  sbc .tl_set:N = \l_pablo_meta_brackcolor_tl,
  sbc .initial:n = black,
  cbc .tl_set:N = \l_pablo_meta_bracecolor_tl,
  cbc .initial:n = black,
 }


% internal commands
\cs_new_protected:Npn \pablo_meta_generic:Nnn #1 #2 #3
 {
  \group_begin:
  \keys_set:nn { pablo/meta } { #2 }
  \color{ \l_pablo_meta_color_tl }
  \l_pablo_meta_font_tl
  #1 { #3 } % #1 is \pablo_meta:n, \pablo_marg:n or \pablo_oarg:n
  \group_end:
 }
\cs_new_protected:Npn \pablo_meta:n #1
 {
  \pablo_meta_angle:n { \textlangle }
  \pablo_meta_meta:n { #1 }
  \pablo_meta_angle:n { \textrangle }
 }
\cs_new_protected:Npn \pablo_marg:n #1
 {
  \pablo_meta_brace:n { \textbraceleft }
  \pablo_meta:n { #1 }
  \pablo_meta_brace:n { \textbraceright }
 }
\cs_new_protected:Npn \pablo_oarg:n #1
 {
  \pablo_meta_brack:n { [ }
  \pablo_meta:n { #1 }
  \pablo_meta_brack:n { ] }
 }
\cs_new_protected:Npn \pablo_meta_meta:n #1
 {
  \textnormal{\textit{#1}}
 }
\cs_new_protected:Npn \pablo_meta_angle:n #1
 {
  \group_begin:
  \fontfamily{cmr}\selectfont
  \textcolor{\l_pablo_meta_anglecolor_tl}{#1}
  \group_end:
 }
\cs_new_protected:Npn \pablo_meta_brace:n #1
 {
  \group_begin:
  \color{\l_pablo_meta_bracecolor_tl}
  #1
  \group_end:
 }
\cs_new_protected:Npn \pablo_meta_brack:n #1
 {
  \textcolor{\l_pablo_meta_brackcolor_tl}{#1}
 }
\ExplSyntaxOff


\begin{document}

\noindent
\meta{something}\\
\marg{mandatory argument}\\
\oarg{optional argument}

\noindent
\meta[cf=red,ac=green]{something}\\
\marg[type=rm,cbc=red]{mandatory argument}\\
\oarg[type=rm,sbc=blue]{optional argument}

\end{document}
\noindent
\meta{something}\\
\marg{mandatory argument}\\
\oarg{optional argument}

\noindent
\meta{something}\\
\marg{mandatory argument}\\
\oarg{optional argument}

\noindent
\meta{something}\\
\marg{mandatory argument}\\
\oarg{optional argument}

\end{document}

libertine로마자와 고정 폭 글꼴의 차이가 Computer Modern에서 더 잘 보이기 때문에 주석을 달았습니다 .

여기에 이미지 설명을 입력하세요

\meta, \marg및 는 키 \oarg설정을 수행하고 적절한 내부 명령을 호출하는 일반 명령으로 정의됩니다. 모든 항목은 특정 매크로로 정의되므로 통일성을 확보할 수 있습니다.

관련 정보