Q&A 마당은 텍 관련 질문/답변을 위해 만들었습니다.
- 로그인 없이 자유롭게 글을 읽고 쓸 수 있는 철학은 처음과 같이 계속됩니다.
- 질문 전에 아래를 읽어 보세요. 좋은 질문이 좋은 답을 받을 수 있는 좋은 방법입니다.
- 질문에 맞는 제목을 붙이세요. 질문의 내용과 관련없는 "고수님", "긴급질문", "도와주세요"와 같은 제목은 답이 잘 올라오지 않습니다. 이 게시판에 올라오는 모든 글은 질문입니다. 굳이 [질문], [Q]를 적으실 필요도 없습니다.
- 내용을 충실히 적어 주시고, 같은 상황을 재현할 수 있는 최소한의 예제가 같이 있어야 합니다.
- 최소 예제는 "Minimal working example"을 읽어 보세요.
- 파일을 첨부하실 때에는 가능한 압축하여 파일 크기를 줄여서 올려주시길 바랍니다.
- 개인적으로 사용하신 글꼴이 들어 있는 경우, preparefont.sty에 관한 답변을 참조하세요.
- 스팸 글을 막기 위하여 짧은 시간 내에 다시 글이 등록되는 IP를 막거나, 광고 글을 막기 위하여 금지어로 .com, .net 등을 설정하고 있습니다. 다소간의 불편함이 있으시더라도 양해 바랍니다.
- 금지어에서 stackexchange, stackoverflow, ctan, overleaf, , github, google.com, gmail.com, .org, .io, sil.org, wiki.com, tistory.com등은 해제하였습니다.
- MathJax를 이용한 수식조판을 사용하실 수 있습니다. 여기를 참조하세요.
- 사용하는 편집기는 CKeditor입니다.
- 편집기에서 [enter]를 누르면 <p> 태그가 들어가고, 문단으로 생각하고 한 줄을 비웁니다.
- 글줄만 바꾸려면 [shift-enter]를 누르면 <BR> 태그가 들어가므로 용도에 맞게 나누어 쓸 수 있습니다.
- 수식를 문서내에 삽입하시려면 에디터를 툴바에서 [소스]를 눌러 HTML로 입력할 수 있게 바꾸신 후 <pre> </pre> tag를 사용하셔서 <pre> 여러 줄의 수식 </pre>처럼 입력하시면 좋습니다.
가변적인 표를 만들 수 있을까요?
2015.04.18 12:38
표 자체는 간단하게 생겼습니다.
\begin{tabular}{|c|c|c|c|c|c|c|c|c|}
\hline
1 & 2 & 3(a) & 3(b) & 4 & 5 \\ \hline
~~~ & ~~~ & ~~~ & ~~~ & ~~~ & ~~~ \\ \hline
\end{tabular}
두 행에 여러 칸이 있는 정도입니다.
이걸 가변적으로 처리하고 싶습니다.
\mytable{1}{2}{3(a)}{3(b)}{4}{5}
\mytable{1}{2}{3}{4}{5}
\mytable{1}{2(a)}{2(b)}{3(a)}{3(b)}{3(c)}{4}{5}
로 입력하면 저런 식으로 표가 그려지게 하고 싶은데, 어떻게 하면 되는지 모르겠습니다.
다행히(?) 인자는 9개를 넘지 않습니다.
댓글 5
-
nanim
2015.04.18 13:51
-
puzzlist
2015.04.18 15:17
오오! 감사합니다. ^^
-
nanim
2015.04.18 18:06
인자를 콤마로 분리해서 입력해도 상관없다면 다음과 같이 더 간단히(?) 할 수 있습니다.
(ksforloop은 KTUG 사설저장소로부터 설치할 수 있습니다.)
이 방법의 좋은 점은 입력 부담이 덜하다는 것 말고도 9개 인자 제한으로부터도 자유롭다는 것일 겁니다.
\usepackage{ksforloop}
\ExplSyntaxOn
\NewDocumentCommand \mytable { m }
{
\clist_set:Nn \l_tmpa_clist { #1 }
\clist_clear:N \l_tmpb_clist
\int_set:Nn \l_tmpa_int { \clist_count:N \l_tmpa_clist }
\ksforloop*{}{ \l_tmpa_int }
{ \clist_put_right:Nn \l_tmpb_clist { \space\space\space } }
\begin { tabular } { | *{ \l_tmpa_int } { c| } }
\hline
\clist_use:Nn \l_tmpa_clist { \c_alignment_token }
\cr \hline
\clist_use:Nn \l_tmpb_clist { \c_alignment_token }
\cr \hline
\end { tabular }
}
\ExplSyntaxOff
첨부파일을 참고하시기 바랍니다.
-
nanim
2015.04.18 19:32
다음 해법은 원래 제시된 문제대로 가변 인자를 처리하는 것입니다. 인자의 개수 제한을 없애기 위하여 꼬리재귀 방법을 사용했습니다.
\usepackage{ksforloop}
\ExplSyntaxOn
\NewDocumentCommand \mytable { }
{
\clist_clear:N \l_tmpa_clist
\clist_clear:N \l_tmpb_clist
\mytable_parse_args:n
}
\cs_new:Npn \mytable_parse_args:n #1
{
\clist_put_right:Nn \l_tmpa_clist { #1 }
\peek_catcode:NTF \c_group_begin_token
{ \mytable_parse_args:n }
{ \draw_mytable: }
}
\cs_new:Nn \draw_mytable:
{
\ksforloop* { } { \clist_count:N \l_tmpa_clist }
{ \clist_put_right:Nn \l_tmpb_clist { \space\space\space } }
\begin { tabular } { |* { \clist_count:N \l_tmpa_clist } { c| } }
\hline
\clist_use:Nn \l_tmpa_clist { \c_alignment_token }
\cr \hline
\clist_use:Nn \l_tmpb_clist { \c_alignment_token }
\cr \hline
\end { tabular }
}
\ExplSyntaxOff
%%%
\mytable{1}{2}{3(a)}{3(b)}{4}{5}
\mytable{1}{2}{3}{4}{5}
\mytable{1}{2(a)}{2(b)}{3(a)}{3(b)}{3(c)}{4}{5}
\mytable{a}{b}{c}{d}{e}{f}{g}{h}{i}{j}{k}{l}{m}{n}
-
nanim
2015.05.13 11:02
별로 인기없는 expl3를 사용하지 않고 해봤습니다. 인자 개수 제한은 없습니다. 앞서 언급한 글에 나오는 Dohyun Kim 님의 방법을 응용한 것입니다.
\makeatletter
\newcount\icnt
\def\pztable{%
% 두 개의 매크로와 카운터 등을 초기화하고
\def\tablelineup{}\def\tablelinedown{}%
\icnt=\z@
% \pztablefoo를 부른다.
\pztablefoo
}
\def\pztablefoo{%
% 다음 토큰을 \next에 넣고 \pztablefooli 실행
\futurelet\next\pztablefooi
}
\def\pztablefooi{%
% \next 토큰이 {이면 \pztablefooii를 실행하되
% 먼저 \else 이하를 실행시켜서 \pztablefooii의 인자로 \else가
% 오지 않도록 \expandafter
\ifx\next\bgroup \expandafter\pztablefooii
% {가 오지 않을 경우 인자 전달이 종료된 것으로 보고 표를 식자
\else \pztabletable \fi
}
\def\pztablefooii#1{%
% \process에게 인자의 처리를 맡기고 처음으로 돌아간다.
\process{#1}\pztablefoo
}
\def\process#1{%
\advance\icnt by\@ne
% 표의 행(row)을 구성하는 루틴
\ifnum\icnt=\@ne
\protected@xdef\tablelineup{\tablelineup #1}%
\protected@xdef\tablelinedown{\tablelinedown ~~~}%
\else
\protected@xdef\tablelineup{\tablelineup & #1}%
\protected@xdef\tablelinedown{\tablelinedown & ~~~}%
\fi
}
\def\pztabletable{%
% tabular를 그린다
\begin{tabular}{|*{\the\icnt}{c|}}
\hline
\tablelineup \tabularnewline \hline
\tablelinedown \tabularnewline \hline
\end{tabular}%
}
\makeatother
\pztable{1}{2}{3(a)}{3(b)}{4}{5}\pztable{1}{2(a)}{2(b)}{3(a)}{3(b)}{3(c)}{4}{5}\pztable{1}{2}{3}{4}{5}
가변인수를 다루는 방법에 대한 토론은 이 글 참조.
최대 9개를 넘지 않는다는 조건이면 xparse의 g 인자지시자를 이용하는 것이 쉽겠네요.
\usepackage{expl3,xparse}
\ExplSyntaxOn
\NewDocumentCommand \mytable { m g g g g g g g g }
{
\IfValueTF { #9 } { \int_set:Nn \l_tmpa_int { 9 } }
{ \IfValueTF { #8 } { \int_set:Nn \l_tmpa_int { 8 } }
{ \IfValueTF { #7 } { \int_set:Nn \l_tmpa_int { 7 } }
{ \IfValueTF { #6 } { \int_set:Nn \l_tmpa_int { 6 } }
{ \IfValueTF { #5 } { \int_set:Nn \l_tmpa_int { 5 } }
{ \IfValueTF { #4 } { \int_set:Nn \l_tmpa_int { 4 } }
{ \IfValueTF { #3 } { \int_set:Nn \l_tmpa_int { 3 } }
{ \IfValueTF { #2 } { \int_set:Nn \l_tmpa_int { 2 } }
{ \int_set:Nn \l_tmpa_int { 1 } } } } } } } } }
\begin { tabular } { | * { \int_eval:n { \l_tmpa_int } } { c| } }
\hline
#1
\IfValueT { #2 } { & #2 }
\IfValueT { #3 } { & #3 }
\IfValueT { #4 } { & #4 }
\IfValueT { #5 } { & #5 }
\IfValueT { #6 } { & #6 }
\IfValueT { #7 } { & #7 }
\IfValueT { #8 } { & #8 }
\IfValueT { #9 } { & #9 }
\cr \hline
\space\space\space
\IfValueT { #2 } { & \space\space\space }
\IfValueT { #3 } { & \space\space\space }
\IfValueT { #4 } { & \space\space\space }
\IfValueT { #5 } { & \space\space\space }
\IfValueT { #6 } { & \space\space\space }
\IfValueT { #7 } { & \space\space\space }
\IfValueT { #8 } { & \space\space\space }
\IfValueT { #9 } { & \space\space\space }
\cr \hline
\end { tabular }
}
\ExplSyntaxOff
%%%
\mytable{1}{2}{3(a)}{3(b)}{4}{5}
\mytable{1}{2}{3}{4}{5}
\mytable{1}{2(a)}{2(b)}{3(a)}{3(b)}{3(c)}{4}{5}
\mytable{1}
이 방법을 쓰실 때 주의할 것은 \mytable의 (옵션)인자들 사이가 스페이스 같은 것으로 경계가 주어지면 안 된다는 겁니다. 예를 들어 \mytable{1} {2}와 같이 하면 첫 번째 {1}만 인자로 간주합니다.