expl3 구문을 사용하여 너비가 0이고 높이가 지정된 상자에 내용을 설정하고 선택적으로 회전하려면 어떻게 해야 합니까?

expl3 구문을 사용하여 너비가 0이고 높이가 지정된 상자에 내용을 설정하고 선택적으로 회전하려면 어떻게 해야 합니까?

사용Steven B. Segletes의 답변, 다음을 사용하여 수평으로 중심을 맞추고 선택적으로 회전할 수 있습니다.

\centering
\makebox[0pt]{\rotatebox{<angle>}{<contents>}}
\par

그러나 상자의 높이가 지정되도록 지정하고 싶습니다. 게다가 이미 expl3 구문을 사용하는 명령을 사용하여 이 작업을 수행하고 있으므로 expl3 함수를 사용해 보는 것이 의미가 있을 것이라고 생각했습니다. (그러나 나는 이 아이디어에 얽매이지 않습니다. 내 매크로는 이미 TeX, LaTeX2e 및 expl3 구문의 마녀의 맥주이므로 조금 더 실제로는 내가 이미 불쾌하지 않은 어떤 것도 해치지 않을 것입니다.)

다음을 사용하여 원하는 효과를 얻을 수 있습니다.

\documentclass[a4paper]{article}
\usepackage{expl3,xparse,geometry}
\geometry{margin=20mm}
\ExplSyntaxOn
\tl_new:N \l_cfr_troibocs_tl
\bool_new:N \l_cfr_bocs_bool
\keys_define:nn { mycommand }
{
  hfit .bool_set:N = \l_cfr_hfit_bool,
  hfit .default:n = true,
  vfit .bool_set:N = \l_cfr_vfit_bool,
  vfit .default:n = true,
  rotate .code:n = {
    \tl_set:Nn \l_cfr_troibocs_tl {#1}
    \bool_set_true:N \l_cfr_troi_bool },
  troi .bool_set:N = \l_cfr_troi_bool,
  troi .default:n = true,
  troibocs .tl_set:N = \l_cfr_troibocs_tl,
  troibocs .initial:n = 0,
}
\NewDocumentCommand\mycommand { o m }{
  \group_begin:
  \IfValueT{#1}{ \keys_set:nn { mycommand } { #1 } }
  % from Steven B. Segletes's answer at https://tex.stackexchange.com/a/162202/
    \bool_if:NTF \l_cfr_troi_bool
    {
      \hbox_set:Nn \g_tmpa_box {\rotatebox[]{\l_cfr_troibocs_tl}{\file_input:n {#2}}}
    }
    {
      \hbox_set:Nn \g_tmpa_box {\file_input:n {#2}}
    }
    \bool_if:NT \l_cfr_vfit_bool
    {
      \box_set_ht:Nn \g_tmpa_box {.8\textheight}
    }
    \centering
    \bool_if:NTF \l_cfr_hfit_bool
    {
      \makebox[0pt]{\box_use:N \g_tmpa_box}
    }{
      \box_use:N \g_tmpa_box
    }
    \par
  \group_end:
}
\ExplSyntaxOff
\usepackage{filecontents,tikz}
\begin{filecontents}{mytikz.tex}
  \begin{tikzpicture}
    \path [draw, fill] (0,0) rectangle +(265mm,175mm);
  \end{tikzpicture}
\end{filecontents}

\begin{document}
\mycommand[
  rotate=90,
  vfit,
  hfit
  ]{mytikz}
\end{document}

이 작업을 수행하는 더 좋고 깨끗한 방법이 있습니까?

더 많은 정의를 expl3 구문으로 변환하려는 나의 시도는 지금까지 비참한 실패를 겪었습니다. 내 어려움이 다음과 관련이 있다고 의심됩니다.에그레그의 답변하지만 잘 모르겠고 어쨌든 코드를 수정하는 방법도 모르겠습니다.

을 사용하면 \hbox_to_zero:n상자가 수평 중앙에 위치하지 않지만 이 컨텍스트에서 상자 앞에 놓을 수는 없습니다. \leavemode그렇게 하면 모든 것이 완전히 깨질 수 있기 때문입니다. \box_set_wd:Nn \g_tmpa_box {0pt}효과가 없으므로 높이를 변경하면서 상자의 너비도 변경할 수 없습니다 .

\rotatebox[또한 를 새로운 실험적 확장으로 교체하려고 시도했지만 \box_rotate:Nn기대에 비해 이상하게 작동하므로 그 아이디어를 포기했습니다.]

답변1

귀하의 요구 사항을 잘 이해한다면 표준 방법으로 충분합니다.

\documentclass{article}
\usepackage{graphicx,lipsum,color}

\newcommand\rotbox[3][\dimexpr\height+\depth\relax]{%
  % #1 is the final height, #2 is the angle, #3 the contents
  \raisebox{\depth}[#1][0pt]{%
    \makebox[0pt]{%
      \rotatebox{#2}{\color{red}#3}%
    }%
  }%
}

\begin{document}

\lipsum[3]
\begin{center}
XX\rotbox{45}{This text is rotated}XX
\end{center}
\lipsum*[2]
\begin{center}
XX\rotbox[4cm]{45}{This text is rotated}XX
\end{center}
\lipsum[2]

\end{document}

좀 더 명확하게 표현하기 위해 빨간색을 추가했습니다. 자연스러운 너비(회전 후)를 원할 경우 \makebox[0pt].

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

가능한 expl3버전:

\documentclass{article}
\usepackage{graphicx,lipsum,color,xparse}

\ExplSyntaxOn
\NewDocumentCommand{\xrotbox}{O{}m}
 {
  \group_begin:
  \keys_set:nn { cfr/rotbox } { #1 }
  \cfr_xrotbox:n { #2 }
  \group_end:
 }

\keys_define:nn { cfr/rotbox }
 {
  hfit .bool_set:N = \l_cfr_hfit_bool,
  hfit .default:n = true,
  vfit .bool_set:N = \l_cfr_vfit_bool,
  vfit .default:n = true,
  rotate .fp_set:N = \l_cfr_rotate_fp,
  rotate .initial:n = 0,
  %troi .bool_set:N = \l_cfr_troi_bool,
  %troi .default:n = true,
  %troibocs .tl_set:N = \l_cfr_troibocs_tl,
  %troibocs .initial:n = 0,
 }

\box_new:N \l_cfr_xrotbox_box

\cs_new_protected:Npn \cfr_xrotbox:n #1
 {
  \hbox_set:Nn \l_cfr_xrotbox_box { #1 }
  \fp_compare:nF { \l_cfr_rotate_fp = \c_zero_fp }
   {
    \box_rotate:Nn \l_cfr_xrotbox_box { \l_cfr_rotate_fp }
   }
  \hbox_set:Nn \l_cfr_xrotbox_box
   {
    \box_move_up:nn { \box_dp:N \l_cfr_xrotbox_box } { \box_use:N \l_cfr_xrotbox_box }
   }
  \bool_if:NF \l_cfr_hfit_bool
   {
    \hbox_set_to_wd:Nnn \l_cfr_xrotbox_box { 0pt }
     {
      \hss \box_use:N \l_cfr_xrotbox_box \hss
     }
   }
  \bool_if:NF \l_cfr_vfit_bool
   {
    \box_set_ht:Nn \l_cfr_xrotbox_box { 0pt }
   }
  \leavevmode\box_use:N \l_cfr_xrotbox_box
 }
\ExplSyntaxOn

\begin{document}

\lipsum[3]
\begin{center}
XX\xrotbox[rotate=45]{This text is rotated}XX
\end{center}
\lipsum*[2]
\begin{center}
XX\xrotbox[rotate=45,hfit,vfit]{This text is rotated}XX
\end{center}
\lipsum[2]

\end{document}

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

답변2

이는 다음을 기반으로 합니다.에그레그의 답변하지만 내가 실제로하고 싶었던 일에 적응되었습니다. 내 원래 질문이 맥락을 충분히 설명하지 못해 불분명한 것 같습니다. 따라서 나는 egreg의 답변이 완벽하게 좋은 것이라고 생각합니다. 그러나 다른 사람에게 유용할 경우를 대비해 해당 답변을 적용하여 생각해낸 코드도 게시하고 있습니다.

코드의 요점은 사용 가능한 공간에 비해 너무 크지만 인간(TeX가 아닌) 관점에서는 실제로 맞는 이미지를 조판하는 것입니다. 예를 들어, 마인드 맵은 적당한 양의 빈 공간을 포함하고 있기 때문에 너무 크게 '보이지' 않고 페이지 영역을 약간 넘길 수 있습니다.

이 작업을 수행하기 위해 실제로 사용하고 있는 명령은 파일을 입력하고 선택적으로 제목과 부제, ToC 및 참고 문헌 항목을 조판합니다. 일반적으로 입력되는 내용은 대부분 텍스트입니다. 그러나 동일한 명령을 사용하여 제목이 있는 단일 페이지 이미지를 조판하여 서식 등의 일관성을 보장하고 싶었습니다. 이 경우 파일 내용이 상자에 들어가 추가로 조작되는 반면, 표준에서는 경우에는 정상적으로 입력됩니다.

아래 코드는 이미지 사례에만 적용됩니다. 즉, 일반 케이스와 이미지 케이스를 구별하거나 제목, ToC 또는 참고문헌을 걱정하지 않습니다.

\mycommand[]{}0~3개의 키로 구성된 선택적 인수를 사용합니다.

  • rotate=<angle>내용을 회전해야 하는지 여부
  • hfit0pt너비가 있는 상자의 중앙에 내용을 배치하여 내용을 수평으로 맞춰야 하는지 여부
  • vfit.8\textheight내용물을 상자의 원래 높이와 상자 높이 사이의 차이의 절반을 더한 높이의 상자에 넣어 강제로 수직으로 맞춰야 하는 경우 .8\textheight.

필수 인수는 입력할 파일의 이름입니다. 예를 들어 tikzpicture마인드 맵을 포함하는 파일의 이름입니다.

예시 사진은 보다 조금 더 넓고 \textheight, 조금 더 높습니다 \textwidth. 따라서 회전하더라도 TeX에 관한 한 너무 큽니다. (단일 블랙박스이기 때문에 인간이 보기엔 너무 커 보이지만, 요점은 내가 관심 있는 영상의 종류와 충분히 유사한 크기를 가지고 있다는 점이다.)

이것이 실제로 정확한지는 확실하지 않지만, 정식 버전은 지금까지 작동하는 것 같습니다....

\documentclass[a4paper]{article}
\usepackage{expl3,xparse,geometry}
\geometry{margin=20mm}
\ExplSyntaxOn
\fp_new:N \l_cfr_troibocs_fp
\bool_new:N \l_cfr_bocs_bool
\dim_zero_new:N \l_cfr_width_dim
\box_new:N \l_cfr_bocs_box
\NewDocumentCommand\mycommand{O{}m}
 {
  \group_begin:
  \centering
  \keys_set:nn { cfr/rotbox } { #1 }
  \cfr_troibocs:n { 0pt } { .8\textheight } { #2 }
  \par
  \group_end:
 }

\keys_define:nn { cfr/rotbox }
 {
  hfit .bool_set:N = \l_cfr_hfit_bool,
  hfit .default:n = true,
  vfit .bool_set:N = \l_cfr_vfit_bool,
  vfit .default:n = true,
  rotate .fp_set:N = \l_cfr_troibocs_fp,
  rotate .initial:n = 0,
 }
\cs_new_protected:Npn \cfr_troibocs:n #1 #2 #3
 {
  \hbox_set:Nn \l_cfr_bocs_box { #3 }
  \fp_compare:nF { \l_cfr_troibocs_fp = \c_zero_fp }
   {
    \box_rotate:Nn \l_cfr_bocs_box { \l_cfr_troibocs_fp }
   }
  \hbox_set:Nn \l_cfr_bocs_box
   {
    \box_move_up:nn { \box_dp:N \l_cfr_bocs_box } { \box_use:N \l_cfr_bocs_box }
   }
  \bool_if:NT \l_cfr_hfit_bool
   {
    \hbox_set_to_wd:Nnn \l_cfr_bocs_box { #1 }
     {
      \hss \box_use:N \l_cfr_bocs_box \hss
     }
   }
  \bool_if:NT \l_cfr_vfit_bool
   {
     \dim_set:Nn \l_cfr_width_dim { \box_ht:N \l_cfr_bocs_box }
     \dim_sub:Nn \l_cfr_width_dim { #2 }
     \dim_compare:nNnT {0pt} < \l_cfr_width_dim
     {
       \vbox_set_to_ht:Nnn \l_cfr_bocs_box { #2 + .5\l_cfr_width_dim }
         {
           \vss \box_use:N \l_cfr_bocs_box \vss
         }
     }
   }
  \leavevmode\box_use:N \l_cfr_bocs_box
 }
\ExplSyntaxOff
\usepackage{filecontents,tikz}
\begin{filecontents}{mytikz.tex}
  \begin{tikzpicture}
    \path [draw, fill] (0,0) rectangle +(265mm,175mm);
  \end{tikzpicture}
\end{filecontents}

\begin{document}
\mycommand[
  rotate=90,
  hfit,
  vfit
  ]{\input{mytikz}}
\end{document}

더미 출력

관련 정보