외부 텍스트에서 앰퍼샌드 억제

외부 텍스트에서 앰퍼샌드 억제

외부 파일에서 데이터를 가져오기 위해 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}

여기에 이미지 설명을 입력하세요

관련 정보