Başka bir sayfadaki bir alt başlığa veya bağlantıya çapraz referans ekleme


Yanıtlar:


207

"ReST / Sphinx" ifadesi sorunun kapsamını belirsizleştiriyor. Genel olarak reStructuredText ve Sphinx ile mi ilgili , yoksa yalnızca Sphinx'te kullanılan reStructuredText ile mi ilgili (ve genel olarak reStructuredText değil)? Her ikisini de ele alacağım çünkü RST kullanan kişiler bir noktada her iki durumla da karşılaşacaklar:

Sfenks

Sınıflar ( :class:) gibi çeşitli varlıklara bağlanmak için kullanılabilecek alana özgü yönergelerin yanı sıra, burada:ref: belgelenen genel bir yönerge de vardır . Bu örneği veriyorlar:

    .. _my-reference-label:

    Section to cross-reference
    --------------------------

    This is the text of the section.

    It refers to the section itself, see :ref:`my-reference-label`.

RST tarafından sunulan genel köprü oluşturma mekanizması Sphinx'te çalışsa da, dokümantasyon Sphinx'i kullanırken bunu kullanmamanızı tavsiye ediyor:

Ref kullanımı, bölümlere olan standart reStructuredText bağlantıları yerine ( Section title_ gibi ) tavsiye edilir çünkü dosyalar arasında, bölüm başlıkları değiştirildiğinde ve çapraz referansları destekleyen tüm oluşturucular için çalışır.

RST, Genel olarak

RST dosyalarını HTML'ye dönüştüren araçlar mutlaka bir koleksiyon kavramına sahip değildir . Örneğin, RST dosyalarını HTML'ye dönüştürmek için github'a güveniyorsanız veya gibi bir komut satırı aracı kullanıyorsanız, durum budur rst2html. Ne yazık ki, istenen sonucu elde etmek için kullanılacak çeşitli yöntemler, kullandığınız araca bağlı olarak değişir. Örneğin, rst2htmlfile kullanıyorsanız ve dosyada A.rst"Bölüm" adlı bir bölüme bağlanmak other.rstistiyorsanız ve son HTML'nin bir tarayıcıda çalışmasını A.rstistiyorsanız , o zaman şunları içerir:

`This <other.html#section>`__ is a reference to a section in another
file, which works with ``rst2html``. Unfortunately, it does not work
when the HTML is generated through github.

Son HTML dosyasına bağlanmanız ve idbölüme verilenin ne olacağını bilmeniz gerekir. Aynı şeyi github üzerinden sunulan bir dosya için yapmak istiyorsanız:

`This <other.rst#section>`__ is a reference to a section in another
file, which works on github. Unfortunately, it does not work when you
use ``rst2html``.

Burada da idbölüme verilenleri bilmeniz gerekiyor . Ancak, RST dosyasına bağlantı oluşturursunuz, çünkü HTML yalnızca RST dosyasına erişildiğinde oluşturulur. (Bu cevabı yazarken, HTML'ye doğrudan erişime izin verilmez.)

Tam bir örnek burada mevcuttur .


9
Soru sahibi tarafından kabul edilenden çok daha iyi bir cevap. (Buna rağmen RST, in General, hayal kırıklığı yaratan bir haberdi!)
dlm

1
Sfenks .. _my-reference-label:yaklaşımının bir dezavantajı , bağlantıdan my-reference-labelsonra URL'de gösterilmesidir #. Bu yüzden güzel etiket isimleri kullanmak gerekir. Ayrıca, TOC her zaman bir #-bağlantı oluşturur Section to cross-referenceve bu nedenle biri #aynı bölüme iki farklı bağlantıyla son bulur.
st12

4
Bağlantınıza farklı bir ad vermek istiyorsanız her zaman kullanabilirsiniz:ref:`Link title <lmy-reference-label>`
HyperActive

53

2016 için yeni, daha iyi yanıt!

Otomatik bölüm uzantısı bunu kolayca yapmanızı sağlar.

=============
Some Document
=============


Internal Headline
=================

daha sonra...

===============
Some Other Doc
===============


A link-  :ref:`Internal Headline`

Bu uzantı yerleşiktir, bu nedenle tek ihtiyacınız olan şey düzenlemek conf.py

extensions = [
    .
    . other
    . extensions
    . already
    . listed
    .
    'sphinx.ext.autosectionlabel',
]

Dikkat etmeniz gereken tek şey, artık belge koleksiyonunda dahili başlıkları kopyalayamayacağınızdır. (Buna değer.)


5
Bu cevabı yazdığımdan beri, pratikte bu yaklaşımla ilgili birkaç problem keşfettim. İlk olarak, bölüm yeniden adlandırılması bir sorundur. İkincisi, genellikle kullanmak istediğiniz "Daha fazla bilgi edinin" veya "genel bakış" gibi kısa bölüm başlıklarına sahip olursunuz, bunu yapıyorsanız bunu yapamazsınız. Çözüm: yeniden adlandırdığınızda / olduğunda bölüm başlığını ekleyin; Kısa bölüm başlıkları için bir bölüm başlığı ekleyin (gibi _page-title-learn-more). Biraz can sıkıcı ama yine de çoğunlukla otomatik kesmeye güvenmeyi seviyorum.
Adam Michael Wood

12
Sphinx 1.6, her bölüm etiketinin önüne geldiği belgenin adını ekleyerek yinelenen başlık sorununu önlemenizi sağlayan autosectionlabel_prefix_documentyapılandırma seçeneğini sunar .
pmos

2
Bu en iyi çözüm. Ve bağlantı başlığı ile kolayca değiştirilebilir :ref:`Link title <Internal Headline>`. Ayrıca,:doc:`quickstart`
HyperActive

5

Misal:

Hey, read the :ref:`Installation:Homebrew` section.

Homebrewadlı farklı bir belgenin içindeki bir bölüm nerede Installation.rst.

Bu, otomatik algılama özelliğini kullanır , bu nedenle config.pyaşağıdakilerle düzenlemeniz gerekir :

extensions = [
    'sphinx.ext.autosectionlabel'
]
autosectionlabel_prefix_document = True

2.0.0b1'de eklediler autosectionlabel_maxdepth, bu nedenle otomatik bölüm etiketinin çalışması için bu değişkeni> = olarak ayarlamanız gerekir 2. Docs dizine yazma üretilir Ayrıca, gibi html, onun adıyla ref önek gerekir: :ref:'html/Installation:Homebrew'. Bu nedenle generated, HTML dışındaki biçimlerle kullanıldığında referansları daha az tuhaf hale getirmek için bazı genel dizin isimleri seçmek isteyebilirsiniz . Bu nedenle, 'Homebrew <Installation.html#Homebrew>'__Sfenks'e bağlı kalmadan, doğru reST kullanmaya devam edebilirsiniz .
Pugsley

Ben gerek yoktu html/önek
Chris
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.