Q&A 마당은 텍 관련 질문/답변을 위해 만들었습니다.
- 로그인 없이 자유롭게 글을 읽고 쓸 수 있는 철학은 처음과 같이 계속됩니다.
- 질문 전에 아래를 읽어 보세요. 좋은 질문이 좋은 답을 받을 수 있는 좋은 방법입니다.
- 질문에 맞는 제목을 붙이세요. 질문의 내용과 관련없는 "고수님", "긴급질문", "도와주세요"와 같은 제목은 답이 잘 올라오지 않습니다. 이 게시판에 올라오는 모든 글은 질문입니다. 굳이 [질문], [Q]를 적으실 필요도 없습니다.
- 내용을 충실히 적어 주시고, 같은 상황을 재현할 수 있는 최소한의 예제가 같이 있어야 합니다.
- 최소 예제는 "Minimal working example"을 읽어 보세요.
- 파일을 첨부하실 때에는 가능한 압축하여 파일 크기를 줄여서 올려주시길 바랍니다.
- 개인적으로 사용하신 글꼴이 들어 있는 경우, preparefont.sty에 관한 답변을 참조하세요.
- 스팸 글을 막기 위하여 짧은 시간 내에 다시 글이 등록되는 IP를 막거나, 광고 글을 막기 위하여 금지어로 .com, .net 등을 설정하고 있습니다. 다소간의 불편함이 있으시더라도 양해 바랍니다.
- 금지어에서 ktug, stackexchange, stackoverflow, ctan, overleaf, google.com, sil.org, kopus.org, github.com, .io, i.com, tistory.com 등은 해제하였습니다.
- MathJax를 이용한 수식조판을 사용하실 수 있습니다. 여기를 참조하세요.
- 사용하는 편집기는 CKeditor입니다.
- 편집기에서 [enter]를 누르면 <p> 태그가 들어가고, 문단으로 생각하고 한 줄을 비웁니다.
- 글줄만 바꾸려면 [shift-enter]를 누르면 <BR> 태그가 들어가므로 용도에 맞게 나누어 쓸 수 있습니다.
- 수식를 문서내에 삽입하시려면 에디터를 툴바에서 [소스]를 눌러 HTML로 입력할 수 있게 바꾸신 후 <pre> </pre> tag를 사용하셔서 <pre> 여러 줄의 수식 </pre>처럼 입력하시면 좋습니다.
수식에서도 사용가능한 verbatim 구현 명령과 색깔 지정
2014.05.16 19:12
1. 수식에서도 \verb 명령을 쓰는 것까지는 해결하고 (수직모드를 일단 빠져나오도록 하는)
2. 그리고 수식에서 그 부분만 컬러를 주고 싶은데, 그게 잘 안됩니다.
etoolbox 패키지의 \preto, \appto, \pretocmd, \apptocmd 따위를 잘 패치하면 될 것 같은데, 잘 안 됩니다.
\documentclass[nanum,b4paper]{oblivoir}
\usepackage{listings}
\usepackage{etoolbox}
\expandafter\patchcmd\csname \string\lstinline\endcsname{%
\leavevmode
\bgroup
}{%
\leavevmode
\ifmmode\hbox\fi
\bgroup
}{}{%
\typeout{Patching of \string\lstinline\space failed!}%
}
\usepackage{xcolor}
\let\mverb\lstinline
\lstset{basicstyle=\ttfamily}
\pretocmd{\mverb}{\color{red}}{}{}
%\apptocmd{\mverb}{}{}{}
\lstset{columns=fullflexible,frame=single}
\begin{document}
이것은 \lstinline{listings} 패키지의 \lstinline{\lstinline} 명령어입니다.
\verb!\lstinline{\foo X_S %&$}!와 같이 입력하면 \lstinline{\foo X_S %&$}와 같이 나옵니다.
이 \lstinline{\lstinline} 명령을 수식에서도 쓰도록 하기 위해 다음과 같이 패치하였습니다. 수직모드를 잠시 빠져나오도록 하는 것 같습니다. (\href{http://www.rqna.net/qna/qiiuuq-how-can-i-make-lstinline-function-normally-inside-math-mode.html}{Heiko Oberdiek 씨의 글})
\begin{lstlisting}
\usepackage{etoolbox}
\expandafter\patchcmd\csname \string\lstinline\endcsname{%
\leavevmode
\bgroup
}{%
\leavevmode
\ifmmode\hbox\fi
\bgroup
}{}{%
\typeout{Patching of \string\lstinline\space failed!}%
}
\end{lstlisting}
따라서 다음과 같이 수식에서도 \lstinline{\lstinline} 명령을 쓸 수 있습니다.
\begin{lstlisting}
\begin{equation}
x = \lstinline{\foo X_S %&$#^&*()} \sum_{i =1}^\infty
\end{equation}
\end{lstlisting}
\begin{equation}
x = \lstinline{\foo X_S %&$#^&*()} \sum_{i =1}^\infty
\end{equation}
이제 \lstinline{\lstinline} 명령을 \lstinline{\let\mverb\lstinline}처럼 함으로써 강제로 \mverb{\mverb}\color{black} 명령어로 만들었습니다. 그리고 \lstinline{\mverb} 명령 안에 있는 것들은 붉은 색으로 칠하려고 \lstinline{\pretocmd}를 이용하여 패치하였습니다.
\begin{lstlisting}
\pretocmd{\mverb}{\color{red}}{}{}
\end{lstlisting}
근데, \lstinline{\mverb}를 벗어난 뒷부분에도 컬러가 칠해집니다. \verb!\color{red}!가 아마 계속 전역적인 효과를 발휘하는 것일텐데요, 이를 딱 \lstinline{\mverb} 영역에서만 적용하고 싶습니다.
\begin{equation}
x = \mverb{\foo X_S %&$#^&*()} \sum_{i =1}^\infty
\end{equation}
\end{document}
===
장황해졌네요.
* 전에 "인자를 verbatim으로 찍는 명령"의 newverbs 패키지의 \collectverb를 이용하면 컬러를 쉽게 제어할 수 있었는데,
이것은 수식 모드에서는 쓸 수 없습니다. 위의 예로 든 \lstinline를 후킹(패치)할 수 밖에 없던 것이, \collectverb를 수식 모드에서 쓰는 방법을 찾아내는 데 실패했기 때문입니다.
* 결국 제가 구현하고 싶은 것은 본문이든 수식이든 간에, verbatim 텍스트를 구현하는 "\mverb" 명령을 쓰되 컬러까지 제어하고 싶은 것입니다.
\pretocmd{\mverb}{\color{red}}{}{} %% \bgroup을 넣어주고
%\apptocmd{\mverb}{}{}{} %% 적당히 \egroup을 넣어주면 될 것 같은데, 잘 모르겠습니다.
댓글 9
-
nanim
2014.05.16 20:29
-
nanim
2014.05.16 20:41
아, 텍스트 모드에서도 동작해야 하는군요.
\newcommand\mytest[1]{\ifmmode\text{\color{red}\tt #1}\else{\color{red}\ttfamily #1}\fi}
-
nanim
2014.05.16 20:50
뭔가 쓸데없는 답변을 자꾸 다는 느낌이...
아무튼, 위의 방식으로 정의하면,
\mverb{test}나 \mverb|test|나 \mverb+test+나 모두 동일하게 동작해야 합니다.
-
Progress
2014.05.16 23:10
답변 감사합니다. 소스를 쪼금 정리하였습니다.
근데, 실은 align 환경에서 좀 사용해야 하는 상황인데, 위치 정렬 인자 & 때문인지 자꾸 에러가 납니다.
한번 더 도움을 받을 수 있을까요?
(아... verbatim text는 너무 어려워요)
\documentclass[nanum]{oblivoir}
\usepackage{amsmath}
\usepackage{newverbs}
\usepackage[svgnames]{xcolor}
\colorlet{SecondColor}{SeaGreen}
\newcommand\colorverb[2][SecondColor]{\ifmmode\text{\color{#1}\ttfamily #2}\else{\color{#1}\ttfamily #2}\fi}
\def\mverb{\Collectverb{\colorverb}}
\begin{document}
수식 모드에서도 쓸 수 있고
\begin{equation}
x = \mverb{\foo X_S %&$#^&*()} \sum_{i =1}^\infty
\end{equation}
텍스트에서도 쓸 수 있고 \mverb{\foo X_S %&$#^&*()} 이것은 컬러버브입니다.
\begin{equation}
\mverb{X_s} = \sum_{\mverb{c} \in \mverb{COM}} (X,c,0)(Y,S,0) \label{eq:X_s}
\end{equation}
얼라인 환경에서도 되었으면... \mverb{ㅠㅠ}
\begin{verbatim}
\begin{align}
\mverb{X_s} = \sum_{\mverb{c} \in \mverb{COM}} (X,c,0)(Y,S,0) \label{eq:X_s_align}
& = \mverb{\sum c in COM} \label{eq:c_in_COM}
\end{align}
\end{verbatim}
%\begin{align}
%\mverb{X_s} = \sum_{\mverb{c} \in \mverb{COM}} (X,c,0)(Y,S,0) \label{eq:X_s_align}
% & = \mverb{\sum c in COM} \label{eq:c_in_COM}
%\end{align}
\end{document}
-
nanim
2014.05.17 10:49
맨처음에 질문하신 것부터 먼저...
제 생각엔, 원래 작업하시던 데서 다음처럼 하면 원하는 결과를 얻으실 수 있다고 봅니다.
\expandafter\patchcmd\csname \string\lstinline\endcsname{%
\leavevmode
\bgroup
}{%
\leavevmode
\ifmmode\hbox\fi
\bgroup\color{red}
}{}{%
\typeout{Patching of \string\lstinline\space failed!}%
}\pretocmd를 할 필요는 없을 거 같구요.
그런데 이 방법을 align에 적용하는 것은 여전히 난관인 듯한데... equation 안에서 aligned를 쓰면 어찌어찌 에러없이 지나가는 듯도 합니다. (newverbs 방법에서도 마찬가지...)
\begin{equation}
\begin{aligned}
f(x) &= a + bc \mverb{&&&} \label{eq:tst} \\
&= x + y^{\mverb{\\\}} \\
&= \sum_{\mverb{^}} \in \mverb{COM}
\end{aligned}
\end{equation}일단 여기까지... 좀더 살펴보겠습니다.
-
nanim
2014.05.17 11:36
최종 버전(?)입니다.
지금까지 하던 것을 모두 버리고.... 다음처럼 해보았습니다.
\usepackage{examplep}
\usepackage{etoolbox}
\makeatletter
\pretocmd{\pexa@setupverb}{\color{SecondColor}}{}{}
\makeatother
\let\mverb\PVerb -
Progress
2014.05.17 20:57
고맙습니다. 잘 됩니다.
여러 가지 방법을 시도해보다가 혹시나 하는 마음으로 질문을 올렸는데 깔끔하게 해결되었습니다.
그렇지 않았으면 그냥 listing 환경에서
mathescape 옵션을 주고,
각 소스코드의 줄 번호를 우측에 붙인 다음,
이를 후킹하여 equation 카운터를 붙여서 \eqref를 사용하는
dirt trick을 부리려고 했습니다만,
이 경우, 수식 환경처럼 공백이 무시되지 않고 그대로 노출되는 데다
얼라인 환경의 최대 장점인---'&'를 이용한---윗줄과 아랫줄의 깔끔한 수식 정렬이 어렵다는 점이 생겼더랬습니다.
어지간한 verbatim 패키지는 거의 다 훑어봤다고 생각했는데 (역시 제 기준에선 listings 패키지가 제일 좋았습니다. 하이라이팅 수고를 덜기 위해 새로운 프로그램 랭귀지도 등록할 수 있고) examplep라는 패키지가 있는 모양이군요.
이것도 살펴보고 혹시 listings 패키지보다 좋으면 소스를 죄다 바꿔야겠습니다.
감사합니다.
-
Progress
2014.05.18 01:13
이전 테스트에서 \mverb의 컬러를 옵션으로 주었던 것이 못내 아쉬워서 examplep 패키지의 \PVerb 정의해 놓은 부분을 좀 빌려왔어요. 소스는 좀 지저분해도 이 정도면 만족합니다.
\makeatletter
\DeclareRobustCommand\mverb[1][SecondColor]{
\relax\ifmmode\hbox\else\leavevmode%\null prevents break of 1st word
\fi\bgroup
{\pexa@cverb@@verbatimfont}% load .fd files with undisturbed \catcodes
\pexa@setupverb\color{#1}% sets \catcodes, similar to `\let\do\@makeother \dospecial\@noligs \@vobeyspaces'
\pexa@cverb@catcodes
\afterassignment\pexa@cverb@maybeopts\let\reserved@a= %
}
\makeatother
-
nanim
2014.05.18 09:37
네, 그렇게 할 수도 있겠고,
저라면 대략 다음과 같이 하겠습니다.
\makeatletter
\pretocmd{\pexa@setupverb}{\color{\m@verb@color}}{}{}
\let\m@verb\PVerb
\newcommand\mverb[1][\empty]{%
\ifx\empty#1 \def\m@verb@color{SecondColor}\else
\def\m@verb@color{#1}\fi
\m@verb
}
\makeatother
과도하게 고급 기법을 ....
저라면 이렇게 하겠습니다.