Referencia cruzada (ancla con nombre) en rebaja


513

¿Existe una sintaxis de reducción para el equivalente de:

Take me to <a href="#pookie">pookie</a>

... 

<a name="pookie">this is pookie</a>

Respuestas:


692
Take me to [pookie](#pookie)

debe ser la sintaxis de rebaja correcta para saltar al punto de anclaje llamado pookie.

Para insertar un punto de anclaje con ese nombre, use HTML:

<a name="pookie"></a>

A Markdown no parece importarle dónde colocas el punto de anclaje. Un lugar útil para ponerlo es en un encabezado. Por ejemplo:

### <a name="tith"></a>This is the Heading

funciona muy bien (Lo demostraría aquí, pero el renderizador de SO elimina el ancla).

Nota sobre etiquetas de cierre automático y id=versusname=

Una versión anterior de esta publicación sugirió usar <a id='tith' />, usar la sintaxis de cierre automático para XHTML y usar el idatributo en lugar de name.

XHTML permite que cualquier etiqueta esté 'vacía' y 'cerrada'. Es decir, <tag />es una abreviatura de <tag></tag>un par de etiquetas coincidentes con un cuerpo vacío. La mayoría de los navegadores aceptarán XHTML, pero algunos no. Para evitar problemas entre navegadores, cierre la etiqueta explícitamente <tag></tag>, como se recomienda anteriormente.

Finalmente, el atributo name=quedó en desuso en XHTML, por lo que originalmente lo usé id=, lo que todos reconocen. Sin embargo, HTML5 ahora crea una variable global en JavaScript cuando se usa id=, y esto puede no ser necesariamente lo que desea. Por lo tanto, usar name=es probable que ahora sea más amigable.

(Gracias a Slipp Douglas por explicarme XHTML y a Nailer por señalar el efecto secundario HTML5; vea los comentarios y la respuesta del clavador para obtener más detalles. Parece funcionar en todas partes, aunque está en desuso en XHTML).name=


1
No puede ver cómo vincular a su demo de encabezado después de que StackOverflow renderiza el HTML porque su renderizado está eliminando su etiqueta <a> . Es decir, no puede en StackOverflow Markdown.
Slipp D. Thompson

2
Sin embargo, esto funcionará en otros renderizadores Markdown más liberales, pero necesitará una etiqueta de cierre <a> ; la etiqueta <a> no permite el cierre automático. Además, encontré que mi navegador salta el encabezado a menos que la etiqueta <a> esté antes del contenido del encabezado. Correcciones hechas a sus ejemplos.
Slipp D. Thompson

2
Aguanta, vaquero. El hecho de que no tenga ningún estilo en un <a>sin href no significa que se cierre automáticamente. A menos que esté completamente loco, ambos: test-xhtml11 y [ sln.6bitt.com/public/test-html5.htmlfont>(test-html5) representan el resto de la página dentro de la etiqueta <a>. Continúe e inspeccione con un inspector web de su elección.
Slipp D. Thompson

44
@Slipp: OK, creo que entiendo, ahora. Usted codificó <a id="hi"/> rest of doc, pero fue tratado como <a id="hi"> rest of doc</a>. (Y el análisis de elementos de la página también muestra esto). Mi error: miré los elementos que se muestran, no la fuente en bruto. ¿Crees que la respuesta debería modificarse a la luz de esta observación?
Steve Powell

3
El nameatributo también crea variables globales (consulte stackoverflow.com/questions/3434278/… ), por lo que también podría utilizar el idatributo como destino de las URL de identificador de fragmento, según lo previsto.
Bobby Jack

93

En bitbucket.org, la solución votada no funcionaría. En cambio, cuando se usan encabezados (con ##), es posible hacer referencia a ellos como anclajes prefijándolos como # markdown-header-my-header-name, donde # markdown-header- es un prefijo implícito generado por el renderizador, y el resto es el título del encabezado en minúsculas con guiones que reemplazan los espacios.

Ejemplo

## My paragraph title

producirá un ancla implícita como esta

#markdown-header-my-paragraph-title

La URL completa antes de cada referencia de anclaje es opcional, es decir

[Some text](#markdown-header-my-paragraph-title)

es equivalente a

[Some text](https://bitbucket.org/some_project/some_page#markdown-header-my-paragraph-title) 

siempre que estén en la misma página.

Fuente: https://bitbucket.org/tutorials/markdowndemo/overview (edite la fuente de este archivo .md y vea cómo se hacen los anclajes).


1
Esto puede hacer también. De acuerdo con esto: confluence.atlassian.com/bitbucket/… , bitbucket admite la extensión Table of Contents que puede generar automáticamente enlaces y anclajes basados ​​en los encabezados de los documentos. La extensión de TOC se documenta aquí: pythonhosted.org/Markdown/extensions/toc.html Agregue el texto "[TOC]" al comienzo del documento para que se genere.
Binary Phile

8
En Github, ## My paragraph titleproducirá el siguiente ancla user-content-my-paragraph-title, para que pueda hacer referencia a él con [Algún texto] (# user-content-my-parameter-title). Sin embargo, no he encontrado documentación oficial para esto.
toto_tico

Esto también me ayudó en Bitbucket, funciona de maravilla.
Scott Byers

1
Esta es información útil; gracias. Sin embargo, los renderizadores de rebajas sin las extensiones no generarán estos anclajes para usted, y los nombres de encabezado en conflicto generarán identificadores de anclaje en conflicto (o algún truco de distinción inútil, como basta con el número). Los identificadores de ancla explícitos son mejores, más controlables, no están sujetos a cambios aleatorios debido a actualizaciones de texto (consulte el truco anterior) y son útiles para anclar más que solo encabezados. Ambas técnicas son necesarias en general.
Steve Powell

En stackedit.io [linky](#header) era un ancla suficiente y también funcionaba cuando se publicaba en Gist.
Felipe Alvarez

67

Use a name. El uso de un idno es necesario en HTML 5 y creará variables globales en su JavaScript

Consulte la especificación HTML 5, 5.9.8 Navegación a un identificador de fragmento : ambos idy namese utilizan.

Es importante saber que la mayoría de los navegadores aún convierten las ID en variables globales . Aquí hay una prueba rápida . Usar a nameevita la creación de globales y cualquier conflicto que pueda resultar.

Ejemplo usando un nombre:

Take me to [pookie](#pookie)

Y el ancla de destino:

### <a name="pookie"></a>Some heading

55
Votación a favor. El argumento de la variable global es débil, ya que no debería definir (directamente) las variables globales en su JS de todos modos, por lo que no ocurrirá ningún conflicto. Además, la semántica de namey idson diferentes.
Marnen Laibow-Koser

99
@ MarnenLaibow-Koser Nadie está discutiendo la definición de variables globales en JS. Hacer una ID en HTML crea una ventana global. Algunos aminoácidos en la mayoría de los navegadores.
mikemaccana

14
@ MarnenLaibow-Koser Muchas bibliotecas (es decir, no su propio JS, sino el de otra persona) usan un único global, por ejemplo, fineuploader. Si crea un elemento con una ID de fineuploader, no podrá usar el fineuploadermódulo. Evitar la creación de globals innecesarios ayuda a evitar esos conflictos.
mikemaccana

55
Me interesaría realizar algunas pruebas de ese caso y averiguar cuál tiene prioridad. Aprecio el problema teórico, pero en años de desarrollo del lado del cliente, nunca he tenido un ID que rompa ningún JS del lado del cliente (siempre que el HTML fuera válido de otro modo). Continuaré usándolos cuando sean semánticamente apropiados hasta que encuentre problemas reales.
Marnen Laibow-Koser

2
@ MarnenLaibow-Koser I (y muchos otros) han tenido ID de HTML que rompen JavaScript real: ¡hay un ejemplo muy práctico en el comentario al que estás respondiendo! Hay muchas guías de estilo y compañías que siempre usan clases, incluso para singletons, y esta es la razón.
mikemaccana

17

Markdown Anchor admite el hashmark, por lo que un enlace a un ancla en la página simplemente sería[Pookie](#pookie)

En realidad, Gruber Markdown no admite la generación del ancla, pero sí en otras implementaciones, como Markdown Extra .

En Markdown Extra, la ID de anclaje se agrega a un encabezado o subtítulo con {#pookie}.

Github Flavored Markdown en las páginas del repositorio de Git (pero no en Gists) genera automáticamente anclajes con varias etiquetas de marcado en todos los encabezados (h1, h2, h3, etc.), que incluyen:

  • id="user-content-HEADERTEXT"
  • class="anchor"
  • href="#HEADERTEXT"
  • aria-hidden="true" (esto es para un icono de enlace svg que se muestra al pasar el mouse)

Excluyendo el ícono aria / svg, cuando uno escribe:

  • # Header Title

Github genera:

  • <h1><a id="user-content-header-title" class="anchor" href="#header-title">Header Title</a></h1>

Por lo tanto, uno no necesita hacer nada para crear los enlaces de encabezado, y siempre puede vincularlos con:

  • Enlace a la [Header Title](#header-title)

16

No hay una sintaxis fácilmente disponible para hacer esto en la sintaxis original de Markdown, pero Markdown Extra proporciona un medio para asignar al menos ID a los encabezados, que luego puede vincular fácilmente. Tenga en cuenta también que puede usar HTML normal en Markdown y Markdown Extra, y que el nameatributo ha sido reemplazado por el idatributo en versiones más recientes de HTML.


9

Para cualquiera que esté buscando una solución a este problema en GitBook. Así es como lo hice funcionar (en GitBook). Debe etiquetar su encabezado explícitamente, así:

# My Anchored Heading {#my-anchor}

Luego enlace a este ancla como este

[link to my anchored heading](#my-anchor)

La solución y ejemplos adicionales se pueden encontrar aquí: https://seadude.gitbooks.io/learn-gitbook/


¡Gracias! ¡esto funciona! ¡Esto debería ser votado!
Dexter

¡La mejor respuesta! Gracias
invis

7

Tarde a la fiesta, pero creo que esta adición podría ser útil para las personas que trabajan rmarkdown. En rmarkdownno se encuentra incorporado el soporte para las referencias a los encabezados en su documento.

Cualquier encabezado definido por

# Header

puede ser referenciado por

get me back to that [header](#header)

El siguiente es un .rmdarchivo independiente mínimo que muestra este comportamiento. Se puede tejer a .pdfy .html.

---
title: "references in rmarkdown"
output:
  html_document: default
  pdf_document: default
---

# Header

Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. Write some more text. 

Go back to that [header](#header).

4

Usando el último Markdown, debería poder usar la siguiente sintaxis:

[](){:name='anchorName'}

Esto debería crear el siguiente HTML:

<a name="anchorName"></a>

Si desea que el ancla tenga texto, simplemente agregue el texto del ancla dentro de los corchetes:

[Some Text](){:name='anchorName'}


Parece que solo Marukuconoce esta sintaxis. Ver el babelmark.
Ulysse BN

3

Para los generadores de rebajas más comunes. Tiene un ancla autogenerada simple en cada encabezado. Por ejemplo, con pandoc , el ancla generada será una babosa de caso de kebab de su encabezado.

 echo "# Hello, world\!" | pandoc
 # => <h1 id="hello-world">Hello, world!</h1>

Dependiendo del analizador de rebajas que use, el ancla puede cambiar (tome el ejemplo de Symbolrush y La muerte Peluda responde, ¡son diferentes!). Vea este punto de referencia donde puede ver los anclajes generados dependiendo de su implementación de reducción .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.