l3keys (연필 기호)를 사용하는 키 값

Nov 16 2020

다음 MWE를 고려하십시오.

\documentclass[letterpaper,11pt]{article}
\usepackage{l3draw}

\ExplSyntaxOn

\dim_new:N \l__pencil_dim
\fp_new:N \l__pencil_linethickness_fp

\cs_new_protected:Nn \pencil_diagram:n
 {
  \dim_set:Nn \l__pencil_dim { #1 }
  \draw_begin:
  \draw_transform_rotate:n { 110 } %rotation
  \draw_linewidth:n { \l__pencil_linethickness_fp }
  \draw_cap_round:
  \draw_join_round:
  \draw_path_moveto:n { 0.0\l__pencil_dim , 0.125\l__pencil_dim }
  \draw_path_lineto:n { 0.125\l__pencil_dim , 0.0\l__pencil_dim }
  \draw_path_lineto:n { 1.0\l__pencil_dim , 0.0\l__pencil_dim }
  \draw_path_lineto:n { 1.0\l__pencil_dim , 0.25\l__pencil_dim }
  \draw_path_lineto:n { 0.125\l__pencil_dim , 0.25\l__pencil_dim }
  \draw_path_close:
  \color_fill:n { black } %color
  \draw_path_use_clear:n { fill, stroke }
  \draw_path_moveto:n { 1.125\l__pencil_dim , 0.0\l__pencil_dim }
  \draw_path_lineto:n { 1.25\l__pencil_dim , 0.0\l__pencil_dim }
  \draw_path_curveto:nn
    { 1.35\l__pencil_dim , 0.125\l__pencil_dim } 
    { 1.25\l__pencil_dim , 0.25\l__pencil_dim }
  \draw_path_lineto:n { 1.125\l__pencil_dim , 0.25\l__pencil_dim }
  \draw_path_close:
  \color_fill:n { black } %color
  \draw_path_use_clear:n { fill, stroke }
  \draw_end:
 }
\NewDocumentCommand{\explpencil}{ O{1ex} }
 {
    \fp_set:Nn \l__pencil_linethickness_fp { 0.08ex }
    \pencil_diagram:n { #1 }
 } 
\ExplSyntaxOff
\begin{document}
\explpencil[2ex] sample text
\end{document}

@egreg 솔루션에서 그는 l3keys값을 사용하여 사용자가 가질 수있는 입력과 특히 tl_if_empty:NTF. 입력이 필수가 아니며 사용자에게 의존한다는 사실이 마음에 듭니다.

색상 ( \l__pencil_color), 치수 ( \l__pencil_dim) 및 회전 ( \l__pencil_rotation)에 초점을 맞춘 유사한 키 값을 만들려면 어떻게해야합니까 ? 괄호 안의 이름은 제안 된 이름입니다.

나는 다음과 같은 가능성을 찾고있다

  • \explpencil,
  • \explpencil[2ex],
  • \explpencil[2ex,30],
  • \explpencil[red][2ex][30]

입력 순서가 중요하지 않지만 예상 결과를 생성 할 수있는 경우 가급적이면; 말하십시오 \explpencil[red][2ex][30]=\explpencil[2ex][red][30].

답변

2 egreg Nov 16 2020 at 16:24

하나의 선택적 인수는 좋으며 두 개는 기억할 수 있습니다. 둘 이상은 항상 상대적인 순서를 위해 매뉴얼을보아야합니다.

설정할 옵션이 많을 때 키-값 구문을 사용하는 것이 훨씬 좋습니다.

\documentclass[letterpaper,11pt]{article}
\usepackage{l3draw}

\ExplSyntaxOn

% user interface
\NewDocumentCommand{\explpencil}{ O{} }
 {
  \group_begin:
  \aze_pencil_diagram:n { #1 }
  \group_end:
 } 

% variables and variants
\cs_generate_variant:Nn \color_fill:n { V }

\dim_new:N \l__aze_pencil_size_dim
\fp_new:N \l__aze_pencil_linethickness_fp

\keys_define:nn { aze/pencil }
 {
  size  .dim_set:N = \l__aze_pencil_size_dim,
  color .tl_set:N  = \l__aze_pencil_color_tl,
  color .initial:n = black,
  angle .fp_set:N  = \l__aze_pencil_angle_fp,
  angle .initial:n = 110,
  thick .dim_set:N  = \l__aze_pencil_thick_dim,
 }

% internal implementation
\cs_new_protected:Nn \aze_pencil_diagram:n
 {
  \keys_set:nn { aze/pencil } { size=1ex, thick=0.08ex, #1 }
  \draw_begin:
  \draw_transform_rotate:n { \l__aze_pencil_angle_fp } % angle
  \draw_linewidth:n { \l__aze_pencil_thick_dim }
  \draw_cap_round:
  \draw_join_round:
  \draw_path_moveto:n { 0.000\l__aze_pencil_size_dim , 0.125\l__aze_pencil_size_dim }
  \draw_path_lineto:n { 0.125\l__aze_pencil_size_dim , 0.000\l__aze_pencil_size_dim }
  \draw_path_lineto:n { 1.000\l__aze_pencil_size_dim , 0.000\l__aze_pencil_size_dim }
  \draw_path_lineto:n { 1.000\l__aze_pencil_size_dim , 0.250\l__aze_pencil_size_dim }
  \draw_path_lineto:n { 0.125\l__aze_pencil_size_dim , 0.250\l__aze_pencil_size_dim }
  \draw_path_close:
  \color_fill:V \l__aze_pencil_color_tl %color
  \draw_path_use_clear:n { fill, stroke }
  \draw_path_moveto:n { 1.125\l__aze_pencil_size_dim , 0.0\l__aze_pencil_size_dim }
  \draw_path_lineto:n { 1.250\l__aze_pencil_size_dim , 0.0\l__aze_pencil_size_dim }
  \draw_path_curveto:nn
    { 1.35\l__aze_pencil_size_dim , 0.125\l__aze_pencil_size_dim } 
    { 1.25\l__aze_pencil_size_dim , 0.250\l__aze_pencil_size_dim }
  \draw_path_lineto:n { 1.125\l__aze_pencil_size_dim , 0.25\l__aze_pencil_size_dim }
  \draw_path_close:
  \color_fill:V \l__aze_pencil_color_tl %color
  \draw_path_use_clear:n { fill, stroke }
  \draw_end:
 }

\ExplSyntaxOff

\begin{document}

\explpencil{} sample text

\explpencil[size=2ex] sample text

\explpencil[size=1ex,color=red,angle=50,thick=0.01ex] sample text

\end{document}

가능한 옵션은 size, color, anglethick. 마지막 것은 검은 색 연필과는 무관하며 색연필에는 중요합니다.

colorangle초기 값 동안이 sizethick하지? 왜냐하면 우리 는 그림이 맥락에 적응할 수 있도록 size이라는 관점 ex에서 있기를 원하기 때문입니다. 우리가 설정 한 경우 size처음에 1ex,이 차원이 될 것이다 시간에 이렇게 문서 전문에, 설정이 이루어집니다. 에서도 마찬가지로 thick값이 호출 시간에 설정되므로 명시적인 옵션으로 재정의 될 수 있습니다.