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>처럼 입력하시면 좋습니다.
input 안에 \pgfkeysvalueof{something}의 값을 넣고 싶습니다.
2018.02.13 13:55
testy.sty ------------------------------------------------------
\RequirePackage{memory,forloop}
\RequirePackage{pgfkeys}
\def\IfEmpty#1{\pgfkeysgetvalue{#1}{\temp}\ifx\temp\empty\relax}
\let\SetValue\pgfkeyssetvalue
test.tex --------------------------------------------------------
\documentclass{oblivoir}
\usepackage{testy}
\begin{document}
\SetValue{Cansu}{3}
\pgfkeysvalueof{Cansu}
\newcounter{dummyv}
\SetValue{problemPath}{\forloop{dummyv}{0}{\value{dummyv}<\pgfkeysvalueof{Cansu}}{../}Problems/DBs/}
\pgfkeysvalueof{problemPath}
\input{\pgfkeysvalueof{problemPath}ours/2018/2018GA50Q01}
\end{document}
안녕하세요, 경로 지정 관련해서 애를 먹고 있습니다.
cansu(칸 수)를 입력하면 경로를 몇칸 거슬러 올라가는지를 파악하고
그 칸 수에 맞춰서 problemPath의 값을 만듭니다 (3개니까 ../../../이 출력됩니다)
이를 이용해 input 안에 problemPath의 값을 넣어 경로를 입력하려 합니다.
즉 원하는 결과는\input{../../../ours/2018/2018GA50Q01}가 인식되는 것이지만
컴파일되지 않습니다.
고견 부탁드립니다.
댓글 6
-
베이드프즈
2018.02.13 16:53
-
Kriss
2018.02.13 16:58
그렇습니다!
-
Kriss
2018.02.13 17:00
덧붙여서,
그냥 input{/../../ours/2018/2018GA50Q01}인 경우에도 input이 잘 작동합니다.
pgfkeysvalueof{problemPath}를 input{} 안에 입력하면 안되구요.
pgfkeysvalueof{problemPath}에 \protect{}를 걸어도 마찬가지입니다.
-
noname
2018.02.13 17:41
1. \input{\pgfkeysvalueof ... 를 만났을 때 인자로 주어진 매크로는 "fully expandable"해야 합니다. 그런데 이 매크로가 풀리면 \forloop을 만나게 되는데 이것이 expand되지 않기 때문에 오류가 발생한 것으로 보입니다.
2. forloop을 쓰지 말고 pgffor의 \foreach를 써서 다음과 같이 해보기로 합니다.
\foreach \i in {1,...,\pgfkeysvalueof{Cansu}}{../}Problems/DBs/}
이렇게 해도 에러가 발생하는데 그 이유는 \foreach가 사용하는 \temp가 역시 expand되지 않아서 \edef되지 않기 때문입니다.3. 이 문제들을 피해가기 위해서 사용자 리스트에 넣고 합치는 방법을 써보겠습니다.
\gdef\mytmplist{}
\foreach \i in {1,...,\pgfkeysvalueof{Cansu}}%
{%
\xdef\mytmplist{\mytmplist ../}%
}%
\xdef\mytmplist{\mytmplist Problems/DBs/}
\SetValue{problemPath}{\mytmplist}
\pgfkeysvalueof{problemPath}4. 이상을 정리하면 다음과 같이 되겠습니다.
\documentclass{oblivoir} \usepackage{testy,pgffor} \begin{document} \SetValue{Cansu}{3} \pgfkeysvalueof{Cansu} \gdef\mytmplist{} \foreach \i in {1,...,\pgfkeysvalueof{Cansu}}% {% \xdef\mytmplist{\mytmplist ../}% }% \xdef\mytmplist{\mytmplist Problems/DBs/} \SetValue{problemPath}{\mytmplist} \pgfkeysvalueof{problemPath} \input{\pgfkeysvalueof{problemPath}ours/2018/2018GA50Q01} \end{document}
5. 위의 방법을 사용하게 되면 \pgfkeyssetvalue 매크로 자체가 (확장될 때) \foreach 따위를 물고 들어가지 않기 때문에 \foreach 대신 \forloop을 쓰더라도 마찬가지일 것이라고 예상합니다.
6. 그런데, 일정한 숫자에 맞추어서 ../를 추가하는 것을 꼭 \pgfkeys...로 해야 하는 이유가 있습니까? 더 간단한 해결책을 생각할 수 있을 것 같습니다만...
-
베이드프즈
2018.02.13 22:49
전부 expand가 되어야 하는데 그렇지 않아서 발생하는 문제였군요. 안 그래도 foreach문을 써봤는데 역시 되지 않길래 궁금했었는데 그런 이유였군요...
저도 궁금했던 내용이었는데 잘 배워갑니다. 감사합니다.
-
Kriss
2018.02.14 16:19
감사합니다. 의도한 대로 너무나 잘 작동합니다.
6에 대해 답변드리자면.. tex으로 프로그래밍하는 패키지에 대해서도, expand, robust 등의 정의 등을 모르기 때문에 이미 지인에 의해 작성된 코드를 이리저리 바꾸면서 만든 코드이기 때문입니다. SetValue는 변수에 값을 지정하는구나, forloop는 구글링해보니 이런 양식으로 쓰는구나.. 등 주먹구구식으로 작성한거죠.
expl3의 존재는 아는데 그야말로 존재만 알지 어디서부터 어떻게 공부를 시작해야 할지 모르겠네요 ㅜㅜ
\pgfkeysvalueof{problemPath}ours/2018/2018GA50Q01
의 경우 ../../../ours/2018/2018GA50Q01 로 잘 나오는 반면,
그것이 \input{} 안에 들어갔을 때 인식되지 않는 문제가 발생한 것인가요?