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>처럼 입력하시면 좋습니다.
.txt에서 import한 string을 변수로 저장하고 싶습니다.
2014.11.15 14:34
string에 이런저런 연산을 줄 수 있는 stringstrings 라는 패키지를 알게 되어 사용하려고 하는 중입니다.
변수로 사용하려고 하는 string이 길어서 모두 .txt로 저장해 둔 상태인데, \input{...}으로 불러오니 어떻게 변수로 저장할지를 모르겠습니다.
예를 들어 \def\hereString{\input{...}}를 하면 변수에 저장된 건 \input{...} 뿐이라 string으로 사용을 할 수 없는 것 같습니다.
어떻게 해야 import한 .txt를 string 변수로 저장할 수 있을까요?
미리 감사드립니다!
댓글 3
-
nanim
2014.11.16 06:16
-
위대한 서씨
2014.11.16 17:17
이 게시판의 질문들을 보면 첨부파일을 올려달라는 댓글을 많이 보는데, 간과했던 것 같습니다. 조심하겠습니다.
\expandafter\def\expandafter\hereString\expandafter{\input{foo.txt}} 를 시험해보기 위해 간단하게 foo.txt를 '한글'이나 'Hello'라는 단어만 넣어 테스트해 보았는데 되지 않는 것 같습니다. 혹시 어떤 .txt가 가능한지 예시를 들어주실 수 있나요?
두 번째 방법을 아마 사용하게 될 것 같습니다. \def\hereString{ 을 제일 앞에, } 를 제일 뒤에 삽입하면 되는 것이지요? 사실 .txt를 순수하게 내용만 있게 하고 싶어서 방법을 찾고 있는 것이었는데, 어쩔 수 없는 것 같습니다.
비슷한 맥락의 질문 하나만 더 드려도 될런지요. 혹시 .txt와 비슷하지만 .tex에서 import하여 쉽게 자료 관리를 할 수 있는 파일 확장자가 있나요? 예를 들어 ini라던가...
-
nanim
2014.11.16 18:51
\def\hereString{\input{foo.txt}} 방식으로 정의하면 \hereString에 들어 있는 것은 문자열이 아니라 \input{foo.txt}라는 토큰열입니다. 따라서 string으로 취급할 수 없지요.
이런 경우에는 파일로부터 읽어들인 토큰을 특정 매크로로 보내는 방식을 쓰는 것이 좋겠습니다.
\newread\ReadFile
\openin\ReadFile=foo.txt
\read\ReadFile to \hereString
\hereString
\stringlength{\hereString}
\closein\ReadFile
이 경우 foo.txt의 끝에 붙은 개행문자도 스페이스 하나로 간주되기 때문에 예컨대 hello를 내용으로 하는 파일의 경우 길이가 6으로 나올 겁니다.
\read 대신 한 줄씩 읽을 수 있는 \readline이라는 e-TeX primitive도 있습니다.
그러나 어쨌든 input할 파일 안에 \def 문이 있는 쪽이 다루기 편합니다.
대체로, 답변하기 위해서 뭔가를 테스트해보아야 하는 성질의 질문을 하신다면
테스트해볼 만한 거리를 제공하시는 것이 답변을 듣기 좋습니다.
이 답변도 테스트없이 일반론입니다.
일단, \def\hereString{\input{foo.txt}} 이 명령에 대해서라면 이론상
\expandafter\def\expandafter\hereString\expandafter{\input{foo.txt}}
이건 되어야 할 듯싶습니다.
그러나 외부 파일을 저렇게 다루는 것은 foo.txt에 들어 있을 글자들의 category code가 문제를 일으킬 가능성이 너무 높습니다. 에스케이프문자라든가 유보문자라든가, \par의 처리, 의도하지 않은 인코딩 문제 등등...
좌우간 저런 식으로 뭔가를 처리하려면 input 되는 파일의 내용을 철저하게 관리하는 수밖에 없습니다.
그러므로, foo.txt 내에 아예
\def\hereString{....}
이 문장이 들어있게 하는 것입니다. 그러면 그냥 \input하면 되니까요.
그러면
\input{foo.txt}
\let\fooString=\hereString
\input{bar.txt}
\let\barString=\hereString
이런 방식으로 여러 파일에서 \fooString, \barString 등을 얻어낼 수 있습니다.
기존 .txt 파일들에 간단한 찾기/바꾸기나 sed같은 걸로 수정하는 것은 어렵지 않으므로 일반적으로 이 쪽을 권장하겠습니다.