
Intento escribir un comando que cada notación pueda vincular a la primera aparición. Considere una notación A y un vector B. Defina un comando que fun{'}=B' y fun{x}=B^{x} para x=/='. Si quiero escribir B^(A), entonces necesito usar el código "divertido{(A)}". Observe que esta "A" utiliza el código "hipervínculo". Pero \equal
no es trabajo cuando \equal{(\hyperlink{x}{y})}{z}
.
Aquí hay un ejemplo mínimo de mi problema:
\documentclass{article}
\usepackage{hyperref}
\usepackage{ifthen}
\newcommand{\hyperaword}{(\hyperlink{1}{456})}
\begin{document}
\hypertarget{1}{3} % work
\hyperlink{1}{2} % work
\ifthenelse{\equal{\string\hyperaword}{456}}{123}{456} % work
\ifthenelse{\equal{\string (\hyperlink{1}{456})}{456}}{123}{456} % ERROR: Use of \hyper@link@ doesn't match its definition.
\end{document}
Este problema sólo ocurre cuando uso "(\hyperlink{xx}{xx})". Si uso "\hyperlink{xx}{xx}" y no "( )", entonces está bien.
Respuesta1
Déjame reescribir tu pregunta:
tengo un comando
\newcommand \f [1] { \ifthenelse { \equal {#1} {...} } ... }
Esto funciona la mayor parte del tiempo, pero cuando
#1
contiene\hyperlink
, genera un error en lugar de simplemente ejecutar la rama falsa.
Respuesta: Como se explica en el ifthen
paquete, #1
esexpandidopara obtener la cadena a comparar.
Si desea comparar el contenido sin procesar, utilice \detokenize
.
\string
sólo funcionan en casos limitados.
\newcommand \f [1] { \ifthenelse { \equal {\detokenize{#1}} {\detokenize{...}} } ... }
Enfoque alternativo: utilice expl3 y \str_if_eq:nnTF
o \tl_if_eq:nnTF
.
Respuesta2
\string
en un comando, el nombre devuelve el nombre como una cadena (una secuencia de caracteres del código cat 12), por lo que \usepackage
es un token único, pero \string\usepackage
son 11 tokens.\
u
s
e
p
a
c
k
a
g
e
\ifthenelse
equal
expande los dos argumentos y luego prueba si son iguales.
\equal{\string\hyperaword}{456}
prueba si los 11 tokens\hyperaword son iguales a los tres tokens 4 5 6 esto nunca es cierto, entonces
\ifthenelse{\equal{\string\hyperaword}{456}}{123}{456}
es siempre456
En la segunda prueba, \string(
se expande (
como (
ya es un carácter del catcode 12, pero \hyperlink
es un comando frágil que no puede usar en un contexto de expansión. De todos modos, construye un enlace usando primitivas pdftex (si está usando pdftex) de modo que, especialmente cuando está rodeado por ()
, nunca será igual a 456
, podría evitar el error usando \protect\hyperlink
, pero luego la prueba es si los tres tokens (
\hyperlink
)
son iguales a tres fichas 4
5
6
y nuevamente esto nunca es cierto.
Respuesta3
Cuando el visor de PDF muestra el archivo PDF,un "hiperobjetivo" básicamente es solo un área 1 en una página de un archivo pdf que tiene un nombre por el cual puede identificarse.
Cuando el visor de PDF muestra el archivo PDF, un "hipervínculo" básicamente es solo un área 1 en una página del archivo PDF donde hacer clic tiene el efecto de desplazar 2 otra área del archivo PDF hasta la ventana donde se encuentra el archivo PDF. Se muestra el archivo pdf.
Entonces, la macro \hypertarget
es una instrucción para que el compilador LaTeX escriba en las directivas del archivo pdf que en el momento de ver el archivo pdf, es decir, en un momento en que el compilador LaTeX ya no se ejecuta, el pdf- El programa de visualización se utiliza para dar un nombre a un área en el archivo pdf. Un área con ese nombre se denomina "objetivo". El nombre de dicha zona se llama "destino". Si un área con nombre es tan pequeña que puede considerarse un único punto en el archivo pdf, entonces también se le llama "ancla". 3
Y la macro \hyperlink
es una instrucción para que el compilador LaTeX escriba en las directivas del archivo pdf que en el momento de ver el archivo pdf, es decir, en un momento en que el compilador LaTeX ya no se ejecuta, el pdf- El programa de visualización se utiliza para conectar un área del archivo pdf con la instrucción de desplazar otra área (de destino) del archivo pdf a la ventana donde se muestra el archivo pdf al hacer clic.
Durante la ejecución de TeX, los motores basados en pdfTeX realizan un seguimiento de los nombres = destinos de áreas nombradas = objetivos/anclas y generan mensajes de error al final de la ejecución de TeX en caso de haber colocado un hipervínculo sin haber introducido un destino correspondiente proporcionando un nombre correspondiente para un área de destino/ancla dentro del archivo pdf.
PeroNingún motor TeX utiliza el mecanismo \hypertarget
/ \hyperlink
para realizar un seguimiento de frases textuales, etc. que aparecen en aquellas áreas desplazables con nombre del archivo pdf.
Resumen sumario:
La macro \hyperlink
no devuelve ninguna información útil durante la ejecución de LaTeX. Simplemente activa instrucciones de escritura en el archivo pdf que son procesadas por el programa de visualización de pdf en el momento de visualizar el archivo pdf.Es decir, estas instrucciones no son procesadas por el compilador latex sino por un programa diferente, concretamente el programa de visualización de PDF. Es decir, estas instrucciones se procesan en un momento en el que el compilador latex ya no se está ejecutando y cuando todos los datos que sólo existen durante la ejecución del compilador latex han dejado de existir.
Las expresiones en su código como
\ifthenelse{\equal{\string\hyperaword}{456}}{123}{456}
e
\ifthenelse{\equal{\string (\hyperlink{1}{456})}
indican intentos de evaluar de alguna manera un "resultado" de la aplicación \hyperlink
durante la ejecución del compilador latex.
Entonces, aunque no sé qué es exactamente lo que intenta lograr, dudo que la macro \hyperlink
entregue tokens/información cuyo procesamiento/examen posterior durante la ejecución de TeX sería de alguna utilidad para usted.
Si lo entiendo correctamente, la pregunta en este momento implica un malentendido de qué \hyperlink
se trata realmente la macro TeX, lo que ya hace que sea difícil entender la pregunta.
Por favor especifique exactamente lo que desea lograr. Probablemente luego pueda modificar mi respuesta para agregar un ejemplo de código que muestre un enfoque al asunto.
1 En el caso de saltos de página/saltos de columna y similares, tanto los hiperdestinos como los hipervínculos pueden consistir en varias áreas, no solo en una sola área.
2 El significado de "desplazarse por otra área del archivo pdf hasta la ventana donde se muestra el archivo pdf" depende del programa que se utilice para ver el archivo pdf, porque las "acciones" en el curso de obedecer estas instrucciones son implementado en ese programa. El comportamiento de diferentes programas de visualización de PDF varía en los casos extremos.
3 El paquete hyperref funciona con anclajes en muchas situaciones, asumiendo que un punto de anclaje se desplaza hasta la esquina superior izquierda de la ventana en la que se muestra el archivo pdf cuando se hace clic en el enlace correspondiente. Internamente, el paquete hyperref especifica la posición de un punto de anclaje en relación con el punto de referencia de ese cuadro que contiene el texto/material que se verá en la ventana de visualización cuando se hace clic en el enlace. En el modo horizontal, donde el propio TeX divide las cosas en cuadros, hasta donde yo sé, es el punto de referencia del primer cuadro horizontal que contiene partes del texto/material que deben verse en la ventana de visualización cuando se hace clic en el enlace.
El siguiente ejemplo proporciona una macro \LinkOrTarget{<destination name>}{<phrase>}
cuya primera instancia con un valor especificado⟨nombre del destino⟩forma el hiperobjetivo y las instancias posteriores forman hipervínculos.
Si se produce un comando \IntroduceHypertargetHere{<destination name>}{<phrase>}
, entonces se forma el hiperdestino mientras que todas las instancias de \LinkOrTarget{<destination name>}{<phrase>}
formulario forman hipervínculos.
Si se produce un comando \IntroduceHypertargetHere{<destination name>}{<phrase>}
, necesitará más de una ejecución de látex hasta que todo coincida.
Por lo tanto: Obedezca las informaciones y advertencias en el terminal y en el archivo .log sobre la necesidad de volver a ejecutar LaTeX (sin eliminar archivos auxiliares entre ejecuciones de LaTeX).
No coloques \IntroduceHypertargetHere{<destination name>}{<phrase>}
por lo mismo⟨nombre del destino⟩mas de una vez. Si lo hace, recibirá advertencias sobre etiquetas definidas varias veces y el hiperobjetivo se creará en la primera de estas instancias.
\documentclass{article}
\usepackage{hyperref}
\usepackage{zref}
\makeatletter
\zref@newprop{DestinationExplicitlyPlaced}{}%
\newcommand\WrapHypertargetInHy@raisedlink[2]{%
\Hy@raisedlink{\hypertarget{#1}{}}#2%
}%
\newcommand\IntroduceHypertargetHere[1]{%
\zref@setcurrent{DestinationExplicitlyPlaced}{true}%
\zref@labelbyprops{ExplicitDestination-#1}{DestinationExplicitlyPlaced}%
\IntroduceHypertargetHereInternal{#1}%
}%
\newcommand\IntroduceHypertargetHereInternal[2]{%
\@ifundefined{NameOfDestination_#1}{%
\expandafter\gdef\csname NameOfDestination_#1\endcsname{}%
\WrapHypertargetInHy@raisedlink
}{\hyperlink}{#1}{#2}%
}%
\newcommand\LinkOrTarget[2]{%
\zref@ifrefundefined{ExplicitDestination-#1}{\IntroduceHypertargetHereInternal}{%
\zref@ifrefcontainsprop{ExplicitDestination-#1}{DestinationExplicitlyPlaced}%
{\hyperlink}{\IntroduceHypertargetHereInternal}%
}%
{#1}{#2}%
}%
\makeatother
\begin{document}
Dummy page
\newpage
Smme text \LinkOrTarget{destination name}{Phrase which either is in link area or is in target area}.
\newpage
Some text \LinkOrTarget{destination name}{Phrase which either is in link area or is in target area}.
\newpage
Some text \LinkOrTarget{destination name}{Phrase which either is in link area or is in target area}.
%Some text \IntroduceHypertargetHere{destination name}{Phrase which is in target area}.
\newpage
Some text \LinkOrTarget{destination name}{Phrase which either is in link area or is in target area}.
\newpage
Some text \LinkOrTarget{destination name}{Phrase which either is in link area or is in target area}.
\end{document}