<!-- Copyright (c) 1998, 1999 Nik Clayton, All rights reserved.

     Redistribution and use in source (SGML DocBook) and 'compiled' forms
     (SGML HTML, PDF, PostScript, RTF and so forth) with or without
     modification, are permitted provided that the following conditions
     are met:

      1. Redistributions of source code (SGML DocBook) must retain the above
         copyright notice, this list of conditions and the following
         disclaimer as the first lines of this file unmodified.

      2. Redistributions in compiled form (transformed to other DTDs,
         converted to PDF, PostScript, RTF and other formats) must reproduce
         the above copyright notice, this list of conditions and the
         following disclaimer in the documentation and/or other materials
         provided with the distribution.

     THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
     ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
     POSSIBILITY OF SUCH DAMAGE.

     $FreeBSD$
     $FreeBSDde: de-docproj/books/fdp-primer/psgml-mode/chapter.sgml,v 1.8 2005/01/16 13:44:56 mheinen Exp $

     basiert auf: 1.9

     Anmerkungen:
     Dieser Text wurde nach dem Lesen von "Technisches Schreiben
     (nicht nur) fuer Informatiker" ueberarbeitet.

-->

<chapter id="psgml-mode">
  <title><literal>sgml-mode</literal> und
    <application>Emacs</application></title>

  <para>Neuere <application>Emacs</application>- und
    <application>XEmacs</application>-Versionen verf&uuml;gen
    &uuml;ber ein n&uuml;tzliches Lisp-Paket namens PSGML. PSGML ist
    ein so genannter <foreignphrase>Majormode</foreignphrase>, der
    Funktionen speziell f&uuml;r den Umgang mit SGML-Dateien,
    -Elementen und deren Attributen bereit stellt. Emacs aktiviert
    PSGML automatisch, wenn eine Datei mit der Endung
    <filename>.sgml</filename> geladen oder der Befehl <command>M-X
      sgml-mode</command> eingegeben wird.</para>

  <para>Die Arbeit an SGML-Dokumenten wie dem FreeBSD-Handbuch kann
    sich wesentlich einfacher gestalten, wenn einige der Funktionen
    von PSGML gekannt sind:</para>

  <variablelist>
    <varlistentry>
      <term><command>C-c C-e</command></term>

      <listitem>
        <para>Ruft die Funktion <literal>sgml-insert-element</literal>
          auf, die nach dem Namen des einzuf&uuml;genden Elements
          fragt. Ist dieser eingegeben worden und wurde die
          <keycap>Eingabetaste</keycap> gedr&uuml;ckt, f&uuml;gt die
          Funktion Start- und Endtag des neuen Elements ein. Sofern
          das eingef&uuml;gte Element laut DTD andere Elemente
          enthalten mu&szlig;, werden diese ebenfalls
          miteingef&uuml;gt.</para>

        <!--? "man" muss weg! Oliver Fischer -->
        <para>Falls man unsicher ist, wie der Name des
          gew&uuml;nschten Elements lautet oder welche Elemente an der
          aktuellen Position erlaubt sind, k&ouml;nnen mittels der
          Taste <keycap>Tab</keycap> alle <emphasis>an dieser
            Stelle</emphasis> m&ouml;glichen Elemente angezeigt
          werden. Ebenso erm&ouml;glicht <keycap>Tab</keycap> die
          Vervollst&auml;ndigung eines bereits eingegebenen
          Elementnamens.</para>


      </listitem>
    </varlistentry>

    <varlistentry>
      <term><command>C-c =</command></term>

      <listitem>
        <para>Ruft die Funktion
          <literal>sgml-change-element-name</literal> auf, mit der das
          aktuelle Element &ndash; das Element zwischen dessen Start-
          und Endtag sich der Cursor befindet &ndash; ausgewechselt
          werden kann. Die Funktion fragt nach dem Namen des neuen
          Elements und ersetzt anschlie&szlig;end Start- und Endtag
          des alten Elements durch die des neuen Elements.</para>
      </listitem>
    </varlistentry>

    <varlistentry>
      <term><command>C-c C-r</command></term>

      <listitem>
        <para>Ruft die Funktion <literal>sgml-tag-region</literal>
          auf, die einen markierten Textabschnitt mit einem Element
          umschlie&szlig;t. Dazu wird zuerst nach dem Namen des
          einzuf&uuml;genden Elements gefragt, und dann dessen
          Starttag am Anfang und dessen Endtag am Ende des markierten
          Textes einf&uuml;gt.</para>
      </listitem>
    </varlistentry>

    <varlistentry>
      <term><command>C-c -</command></term>

      <listitem>
        <para>Ruft die Funktion <literal>sgml-untag-element</literal>
          auf, die Start- und Endtag des Elements entfernt, innerhalb
          dessen sich der Cursor befindet.</para>
      </listitem>
    </varlistentry>

    <varlistentry>
      <term><command>C-c C-q</command></term>

      <listitem>
        <para>Ruft die Funktion <literal>sgml-fill-element</literal>
          auf. Diese Funktion formatiert<footnote>
            <para>Formatieren bedeutet in diesem Zusammenhang,
              dass die Funktion versucht, soviel Zeichen wie
              m&ouml;glich in einer Zeile unterzubringen. Die Stelle,
              bis zu der gef&uuml;llt und dann der Zeilemumbruch
              erfolgt, ist konfigurierbar.</para>
          </footnote> den Inhalt des aktuellen Elements neu. Dieser
          Vorgang betrifft auch Elemente wie
          <sgmltag>programlisting</sgmltag>, in denen Leerzeichen und
          &auml;hnliches Teil der Formatierung sind. Aus diesem Grund
          ist mit <literal>sgml-fill-element</literal> bed&auml;chtig
          umzugehen.</para>
      </listitem>
    </varlistentry>

    <varlistentry>
      <term><command>C-c C-a</command></term>

      <listitem>
        <para>Ruft die Funktion
          <literal>sgml-edit-attributes</literal> auf. Diese
          &ouml;ffnet einen zweiten Puffer mit allen Attributen des
          Elements, innerhalb dessen sich der Cursor befindet.
          &Uuml;ber <keycap>Tab</keycap> kann von einem Attribut zum
          n&auml;chsten gewechselt werden. Ein existierender
          Attributwert kann mit <command>C-k</command> gel&ouml;scht
          werden. Die Tastenfolge <command>C-c C-c</command>
          schlie&szlig;t den Puffer und setzt die Attribute des
          Elements entsprechend den Puffervorgaben.</para>
      </listitem>
    </varlistentry>

    <varlistentry>
      <term><command>C-c C-v</command></term>

      <listitem>
        <para>Ruft die Funktion <literal>sgml-validate</literal> auf,
          die zuerst fragt, ob das aktuelle Dokument gespeichert
          werden soll und anschlie&szlig;end einen SGML-Validator
          aufruft. Die Ausgaben des Validators werden in einem neuen
          Puffer angezeigt. Dadurch hat der Benutzer die
          M&ouml;glichkeit, eventuell vom Validator gefundene Fehler
          zu korrigieren.</para>
      </listitem>
    </varlistentry>
  </variablelist>

  <para>Zweifellos hat PSGML noch weitere n&uuml;tzliche Funktionen, doch
    die hier genannten sind die, die der Autor dieser Fibel am meisten
    benutzt.</para>

  <para>Um den richtigen Einzug, die Umwandlung von Tabulatoren in
    Leerzeichen  und die maximale Zeilenl&auml;nge f&uuml;r Dokumente des FDPs
    sicherzustellen, kann folgender Eintrag in
    <filename>.emacs</filename> vorgenommen werden:</para>

   <programlisting>(setq sgml-mode-hook
   '(lambda ()
     (setq fill-column 70
           indent-tabs-mode nil
           next-line-add-newlines nil
           standard-indent 2)
     (auto-fill-mode t)))</programlisting>

</chapter>


<!--
     Local Variables:
     mode: sgml
     sgml-declaration: "../chapter.decl"
     sgml-indent-data: t
     sgml-omittag: nil
     sgml-always-quote-attributes: t
     sgml-parent-document: ("../book.sgml" "part" "chapter")
     End:
-->

