
외부 파일에서 데이터를 가져오기 위해 datatool 패키지를 사용하여 여러 글자를 생성해 보겠습니다. 회사 이름에는 앰퍼샌드 "&"와 같은 특수 문자가 포함될 수 있으므로 회사 이름을 올바르게 지정하는 것을 제외하면 모든 것이 원활하게 작동합니다. 따라서 회사 이름(예: "Father & Sons")을 가져와서 나중에 내 문서에서 사용할 수 있도록 문자열 변수에 저장합니다.
내 질문은 "&" 및 기타 특수 문자의 해석을 억제하는 방법이 있습니까? 나는 좋은 결과를 얻지 못하고 verbatim
사용해 보았습니다 . alltt
또는 외부 파일의 s를 바꿀 수 있지만 &
가져온 텍스트를 있는 그대로 작성하는 일반적인 솔루션을 사용하는 것이 좋습니다.
아래 예는 단순화되어 있지만 문제를 보여줍니다.
\documentclass[10pt]{article}
\usepackage[a4paper]{geometry}
\newcommand{\txtstring}{Father & Sons}
\newcommand{\txtstringtwo}{Father \& Sons}
\begin{document}
\txtstring
\par
\txtstringtwo
\end{document}
내가 얻는 오류는 "&"로 인해 "잘못된 정렬 탭 문자 &.\txtstring"입니다. 따라서 "&"를 해석하지 않고 문자열 변수를 확인할 수 있습니까?
Henri Menke(및 Ulrike Fischer)가 제안한 "\detokenize"를 사용하는 솔루션은 문제를 해결합니다. egreg에서 제안한 대로 datatool 패키지를 사용하여 "실제" 예제를 추가했습니다.
\documentclass[10pt]{article}
%%% Definer papiropsætning og margin %%%%%%%%%%%%%%%%%%%%%%%
\usepackage[a4paper]{geometry}
\usepackage{datatool} % access .csv
\usepackage[absolute]{textpos}
\usepackage{lipsum}
%%% Definer ingen paragraf indent %%%%%%%%%%%%%%%%%%%%%%%%%
\setlength{\parindent}{0pt}
\newcommand{\txtstring}{Father & Sons}
\newcommand{\txtstringtwo}{Father \& Sons}
%%% Define database load (CSV) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%\DTLsetseparator{;} % use semi-colon as delimter (commas use in quotations)
%\DTLloaddb[noheader,keys={CVR,CompanyName,LastName,FirstName,Address,PostCode,City}]{data}{test2.csv}
%\DTLloaddb[noheader,keys={CVR,CPR,DatoStart,DatoSlut}]{data_detail}{test_detail.csv}
%%% Here I create a database %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\DTLnewdb{testdata}
\DTLnewrow{testdata}%
\DTLnewdbentry{testdata}{CVR}{12 23 45 56}%
\DTLnewdbentry{testdata}{CompanyName}{Fox & Sons}%
\DTLnewdbentry{testdata}{LastName}{Fox}%
\DTLnewdbentry{testdata}{FirstName}{Red}%
\DTLnewdbentry{testdata}{Address}{Fowl Street 1}%
\DTLnewdbentry{testdata}{PostCode}{4567}%
\DTLnewdbentry{testdata}{City}{Fox Town}%
\DTLnewrow{testdata}%
\DTLnewdbentry{testdata}{CVR}{45 56 67 78}%
\DTLnewdbentry{testdata}{CompanyName}{Elephant & Daughters}%
\DTLnewdbentry{testdata}{LastName}{Fant}%
\DTLnewdbentry{testdata}{FirstName}{Eli}%
\DTLnewdbentry{testdata}{Address}{Africa Road 1}%
\DTLnewdbentry{testdata}{PostCode}{1259}%
\DTLnewdbentry{testdata}{City}{Mega City}%
\begin{document}
%%% Here I read from databse an create one letter per line %
\DTLforeach{testdata}{%
\CV=CVR,%
\CN=CompanyName,%
\LN=LastName,%
\FN=FirstName,%
\AD=Address,%
\PC=PostCode,%
\CT=City%
}{%
%%% Write sender %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{textblock*}{\textwidth}[0,0](25mm,37mm)
\scriptsize%
\textbf{Afs: SomeStreet 1, 1234 City}
\end{textblock*}
%%% Write recipient %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{textblock*}{\textwidth}[0,0](25mm,42mm)
\detokenize\expandafter{\CN}\\
\detokenize\expandafter{\FN}~\detokenize\expandafter{\LN}\\%
\detokenize\expandafter{\AD}\\%
\detokenize\expandafter{\PC}~\detokenize\expandafter{\CT}%
\end{textblock*}
%%% Write heading %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{textblock*}{\textwidth}[0,0](20mm,98mm)
\textbf{\Large Here is my header}\\
\lipsum[4]
\end{textblock*}
\null\clearpage
}
\end{document}
답변1
\DTLloadrawdb
대신 다음을 사용하는 솔루션은 다음과 같습니다 \DTLloaddb
.
\documentclass{article}
\usepackage{filecontents}
\usepackage{datatool}
\begin{filecontents*}{test.csv}
CVR,CompanyName,LastName,FirstName,Address,PostCode,City
12 23 45 56,Fox & Sons,Fox,Red,Fowl Street 1,4567,Fox Town
45 56 67 78,Elephant & Daughters,Fant,Eli,Africa Road 1,1259,Mega City
\end{filecontents*}
\DTLloadrawdb{testdata}{test.csv}
\begin{document}
\DTLforeach{testdata}%
{%
\CV=CVR,%
\CN=CompanyName,%
\LN=LastName,%
\FN=FirstName,%
\AD=Address,%
\PC=PostCode,%
\CT=City%
}%
{%
\CV, \CN, \LN, \FN, \AD, \PC, \CT\par
}
\end{document}
앰퍼샌드는 \&
CSV 파일에서 데이터를 읽을 때 자동으로 변환됩니다. 루프 에서는 특별한 작업을 수행할 필요가 없습니다 \DTLforeach
. 위의 예는 다음을 생성합니다.
다른 특수 문자 8개도 마찬가지입니다. 매핑되지 않는 유일한 특수 문자는 백슬래시입니다. 자신만의 매핑을 추가할 수도 있습니다( 이전 \DTLloadrawdb
). 예를 들어:
\DTLrawmap{£}{\pounds}
답변2
데이터를 읽을 때 &의 catcode를 로컬로 설정할 수 있습니다. & 나중에 사용하는 것을 방해하지 않으며 \detokenize와 달리 입력에서 ASCII가 아닌 입력과 같은 다른 명령을 중단하지 않습니다.
\documentclass[10pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[a4paper]{geometry}
\catcode`\&=12
\newcommand{\txtstring}{Father & Sons & Mütter}
\newcommand{\txtstringtwo}{Father \& Sons & Mütter}
\newcommand{\txtstringthree}{\detokenize{Father & Sons & Mütter}}
\catcode`\&=4
\begin{document}
\txtstring: OK
\par
\txtstringtwo: OK
\par
\txtstringthree: Bad
\begin{tabular}{ll}
blub & bla
\end{tabular}
\end{document}