
Hay algunas otras preguntas en este lado que abordan temas relacionados, pero no he encontrado ninguna que cubra exactamente mi problema.
Tengo un texto (convertido de XML) que utiliza el apóstrofe '
con tres significados diferentes: comillas iniciales, comillas finales y para abreviaturas y genitivo ( can't
,, cats'
etc.). ¿Hay alguna manera de mantener el apóstrofe '
tal como está?todos los casos excepto las comillas iniciales, donde debe ser reemplazado por `? Para su información, en realidad estoy usando XeLaTeX en mi documento original, pero no estoy seguro de si va a importar.
\documentclass{memoir}
\begin{document}
He said, 'the cats' hats can't fit me'.
\end{document}
Supongo que la forma de determinar cuál usar es:
- Si el apóstrofe va precedido de un carácter de texto, manténgalo
- Si está precedido por algo más (incluido espacio y nada en absoluto), cámbielo a `
Nota:'tis
Es poco probable que en mis documentos aparezcan apóstrofos de abreviatura al principio de las palabras (como en ).
Respuesta1
Creo que quieres ‘
(cita abierta) sólo cuando '
esté precedido por un espacio o nada en absoluto.
Esto también hace frente al modo matemático.
\documentclass{memoir}
\makeatletter
\let\apostrophe'
\catcode`'=\active
\protected\def'{%
\ifvmode
`%
\else
\ifmmode
\expandafter\expandafter\expandafter\active@math@prime % for math
\else
\ifdim\lastskip>0pt
`%
\else
\apostrophe
\fi
\fi
\fi
}
% redefine \pr@m@s to look for an active '
\def\pr@m@s{%
\ifx'\@let@token
\expandafter\pr@@@s
\else
\ifx^\@let@token
\expandafter\expandafter\expandafter\pr@@@t
\else
\egroup
\fi
\fi}
\makeatother
\begin{document}
He said, 'the cats' hats can't fit me'.
'Ouch,' he said.
Some 'derivatives' $f'+f''+f'''$.
\end{document}
Tenga en cuenta que la segunda línea tendría una comilla abierta después de la coma, según su especificación.
Notas
\protected
se usa o\section{A 'quoted'}
fallaría\section{'quoted'}
fallará y no hay mucho que hacer al respecto
Lo siguiente parece solucionar el problema con los títulos de secciones y capítulos, cuando aparece una cita final.
Compilando con ambos pdflatex
y xelatex
el resultado es el mismo.
\documentclass{memoir}
\usepackage{ifxetex}
\ifxetex
\usepackage{fontspec}
% \setmainfont{Linux Libertine O}
\fi
\makeatletter
% fix latex's habit of resetting ' during \write
\begingroup
\obeylines\obeyspaces%
\catcode`\'\active%
\gdef\@resetactivechars{%
\def^^M{\@activechar@info{EOL}\space}%
\def {\@activechar@info{space}\space}}%
\endgroup
\renewcommand{\cftchapteraftersnumb}{\hskip1sp\relax}
\let\ORIM@sect\M@sect
\def\M@sect#1#2#3#4#5#6[#7][#8]#9{%
\ORIM@sect{#1}{#2}{#3}{#4}{#5}{#6}[\hskip1sp\relax#7][\hskip1sp\relax#8]{\hskip1sp\relax#9}%
}
\catcode`'=\active
\protected\def'{%
\ifvmode
`%
\else
\ifmmode
\expandafter\expandafter\expandafter\active@math@prime % for math
\else
\relax
\ifdim\lastskip=1sp
`%
\else
\ifdim\lastskip>0pt
`%
\else
\rq
\fi
\fi
\fi
\fi
}
% redefine \pr@m@s to look for an active '
\def\pr@m@s{%
\ifx'\@let@token
\expandafter\pr@@@s
\else
\ifx^\@let@token
\expandafter\expandafter\expandafter\pr@@@t
\else
\egroup
\fi
\fi}
\makeatother
\begin{document}
\tableofcontents
\chapter{'Chapter'}
\section{'Quoted'}
He said, 'the cats' hats can't fit me'.
'Ouch,' he said.
Some 'derivatives' $f'+f''+f'''$.
\end{document}
Respuesta2
Si no es necesario distinguir el apóstrofe y la comilla final, puedes intentar:
\def\leftquote{`}\def\rightquote{'}
\catcode`\'=13
\def'{\ifvmode\leftquote \else \ifdim\lastskip=0pt \rightquote \else \leftquote\fi\fi}
He said, 'the cats' hats can't fit me'.
Si el documento utiliza este tipo de "comillas dobles" y necesita componerlas, puede utilizar la siguiente definición:
\def\leftqquote{``}\def\rightqqoute{''} % or another definition, can depend on fonts
% put this definition before \catcode`\'=13
\catcode`\"=13
\def"{\bgroup\def"{\rightqqoute\egroup}\leftqquote}
The normal "quotes" are here.
Editar: debido a que hubo comentarios sobre '
el modo matemático, como `$f'$, agrego esta funcionalidad aquí:
\def\leftquote{`}\def\rightquote{'}
\catcode`\'=13
\def'{\ifmmode \expandafter\mathprime \else\ifvmode \leftquote \else
\ifdim\lastskip=0pt \rightquote \else \leftquote\fi\fi\fi}
\def\mathprime{^\bgroup\catcode`\'=12 \csname prim@s\endcsname}
A diferencia de la respuesta aceptada, no reescribo la \pr@m@s
macro, solo establezco el catcode temporal en 12. Esta solución funciona tanto en TeX simple como en LaTeX, porque \prim@s
la macro se usa en ambos paquetes de macros con el mismo significado.
Respuesta3
Si entiendo correctamente su flujo de trabajo, parece que (a) hay un proceso que crea un archivo .tex compilable que tiene algunos problemas y (b) debe solucionar estos problemas antes de ejecutar el archivo .tex a través de LaTeX. Además, el problema principal parece ser que se utilizan comillas "tontas" (simples) en todo el archivo tex y que desea encontrar una manera de reemplazar algunos de los caracteres de comillas simples (también conocidos como caracteres de apóstrofe) con caracteres entre comillas ( también conocidos como comillas invertidas). No ha indicado explícitamente en qué idioma está configurado su documento, por lo que asumiré por ahora que está en inglés.
Si los caracteres de apóstrofo problemáticos aparecen solo en posiciones intermedias de la oración (y, por lo tanto, están precedidos por caracteres de espacio) y no al comienzo de las líneas, supongo que podría iniciar un editor y reemplazar todas las instancias de
space-apostrophe
conspace-backtick
.Si los caracteres de apóstrofo problemáticos pueden aparecer al principio de las líneas, deberá verificar si su editor puede realizar una búsqueda y reemplazo de
newline_char-apostrophe
fornewline_char-backtick
. Como no ha indicado qué editor (si corresponde) elige, no puedo ofrecerle consejos más específicos sobre cómo realizar esta tarea.
Advertencia: Ambos métodos (y métodos automatizados similares)noproducir resultados correctos si tiene expresiones "literarias" como'tis
(abreviatura de "it is") en el texto de entrada. (El apóstrofe indica una elisión en lugar del comienzo de una cita en tales circunstancias y, por lo tanto, el apóstrofe debenoser reemplazado por una comilla invertida.)