Replace more [BR] with rst bullet lists
authorTeemu Murtola <teemu.murtola@gmail.com>
Tue, 10 Feb 2015 18:48:15 +0000 (20:48 +0200)
committerMark Abraham <mark.j.abraham@gmail.com>
Fri, 13 Feb 2015 16:09:14 +0000 (17:09 +0100)
Make the console output format rst-style bullet lists nicely, and use
these instead of [BR] tags to create proper bullet lists in program help
texts.  The produced output looks much nicer in all the output formats
(including the console) compared to what it was before any rst changes.

Now the number of [BR] tags remaining is relatively low, and can fixed
at some later time.

Change-Id: I8d74f1a8f3a338202ab901d28f608a8c25794f19

15 files changed:
src/gromacs/gmxana/gmx_bar.c
src/gromacs/gmxana/gmx_chi.c
src/gromacs/gmxana/gmx_cluster.c
src/gromacs/gmxana/gmx_dielectric.c
src/gromacs/gmxana/gmx_eneconv.c
src/gromacs/gmxana/gmx_hbond.c
src/gromacs/gmxana/gmx_helix.c
src/gromacs/gmxana/gmx_make_edi.c
src/gromacs/gmxana/gmx_sorient.c
src/gromacs/gmxana/gmx_trjconv.c
src/gromacs/gmxana/gmx_wham.cpp
src/gromacs/onlinehelp/helpwritercontext.cpp
src/gromacs/onlinehelp/tests/helpwritercontext.cpp
src/gromacs/onlinehelp/tests/refdata/HelpWriterContextTest_FormatsBulletList.xml [new file with mode: 0644]
src/gromacs/selection/selhelp.cpp

index b285678247246c668b29861f6d585fa6af9dc30a..84cc7caf32a80e64fe2c8c8481547e35096f3761 100644 (file)
@@ -3508,22 +3508,23 @@ int gmx_bar(int argc, char *argv[])
         "the [REF].mdp[ref] option [TT]foreign_lambda[tt].[PAR]",
 
         "Input option [TT]-f[tt] expects multiple [TT]dhdl.xvg[tt] files. ",
-        "Two types of input files are supported:[BR]",
-        "[TT]*[tt]  Files with more than one [IT]y[it]-value. ",
-        "The files should have columns ",
-        "with dH/d[GRK]lambda[grk] and [GRK]Delta[grk][GRK]lambda[grk]. ",
-        "The [GRK]lambda[grk] values are inferred ",
-        "from the legends: [GRK]lambda[grk] of the simulation from the legend of ",
-        "dH/d[GRK]lambda[grk] and the foreign [GRK]lambda[grk] values from the ",
-        "legends of Delta H",
-        "[BR]",
-        "[TT]*[tt]  Files with only one [IT]y[it]-value. Using the",
-        "[TT]-extp[tt] option for these files, it is assumed",
-        "that the [IT]y[it]-value is dH/d[GRK]lambda[grk] and that the ",
-        "Hamiltonian depends linearly on [GRK]lambda[grk]. ",
-        "The [GRK]lambda[grk] value of the simulation is inferred from the ",
-        "subtitle (if present), otherwise from a number in the subdirectory ",
-        "in the file name.[PAR]",
+        "Two types of input files are supported:",
+        "",
+        " * Files with more than one [IT]y[it]-value. ",
+        "   The files should have columns ",
+        "   with dH/d[GRK]lambda[grk] and [GRK]Delta[grk][GRK]lambda[grk]. ",
+        "   The [GRK]lambda[grk] values are inferred ",
+        "   from the legends: [GRK]lambda[grk] of the simulation from the legend of ",
+        "   dH/d[GRK]lambda[grk] and the foreign [GRK]lambda[grk] values from the ",
+        "   legends of Delta H",
+        " * Files with only one [IT]y[it]-value. Using the",
+        "   [TT]-extp[tt] option for these files, it is assumed",
+        "   that the [IT]y[it]-value is dH/d[GRK]lambda[grk] and that the ",
+        "   Hamiltonian depends linearly on [GRK]lambda[grk]. ",
+        "   The [GRK]lambda[grk] value of the simulation is inferred from the ",
+        "   subtitle (if present), otherwise from a number in the subdirectory ",
+        "   in the file name.",
+        "",
 
         "The [GRK]lambda[grk] of the simulation is parsed from ",
         "[TT]dhdl.xvg[tt] file's legend containing the string 'dH', the ",
@@ -3567,13 +3568,15 @@ int gmx_bar(int argc, char *argv[])
         "and the total. The first part contains detailed free energy ",
         "difference estimates and phase space overlap measures in units of ",
         "kT (together with their computed error estimate). The printed ",
-        "values are:[BR]",
-        "[TT]*[tt]  lam_A: the [GRK]lambda[grk] values for point A.[BR]",
-        "[TT]*[tt]  lam_B: the [GRK]lambda[grk] values for point B.[BR]",
-        "[TT]*[tt]     DG: the free energy estimate.[BR]",
-        "[TT]*[tt]    s_A: an estimate of the relative entropy of B in A.[BR]",
-        "[TT]*[tt]    s_B: an estimate of the relative entropy of A in B.[BR]",
-        "[TT]*[tt]  stdev: an estimate expected per-sample standard deviation.[PAR]",
+        "values are:",
+        "",
+        " * lam_A: the [GRK]lambda[grk] values for point A.",
+        " * lam_B: the [GRK]lambda[grk] values for point B.",
+        " *    DG: the free energy estimate.",
+        " *   s_A: an estimate of the relative entropy of B in A.",
+        " *   s_B: an estimate of the relative entropy of A in B.",
+        " * stdev: an estimate expected per-sample standard deviation.",
+        "",
 
         "The relative entropy of both states in each other's ensemble can be ",
         "interpreted as a measure of phase space overlap: ",
index 4683fed81684a7bc0aa2204914e27fdfb0c5034e..f4156186fa3f8d0b233aac097bfc8bca981cdd6e 100644 (file)
@@ -1251,12 +1251,14 @@ int gmx_chi(int argc, char *argv[])
         "With option [TT]-all[tt], the angles themselves as a function of time for",
         "each residue are printed to separate files [TT](dihedral)(RESIDUE)(nresnr).xvg[tt].",
         "These can be in radians or degrees.[PAR]",
-        "A log file (argument [TT]-g[tt]) is also written. This contains [BR]",
-        "(a) information about the number of residues of each type.[BR]",
-        "(b) The NMR ^3J coupling constants from the Karplus equation.[BR]",
-        "(c) a table for each residue of the number of transitions between ",
-        "rotamers per nanosecond,  and the order parameter S^2 of each dihedral.[BR]",
-        "(d) a table for each residue of the rotamer occupancy.[PAR]",
+        "A log file (argument [TT]-g[tt]) is also written. This contains",
+        "",
+        " * information about the number of residues of each type.",
+        " * The NMR ^3J coupling constants from the Karplus equation.",
+        " * a table for each residue of the number of transitions between ",
+        "   rotamers per nanosecond,  and the order parameter S^2 of each dihedral.",
+        " * a table for each residue of the rotamer occupancy.",
+        "",
         "All rotamers are taken as 3-fold, except for [GRK]omega[grk] and [GRK]chi[grk] dihedrals",
         "to planar groups (i.e. [GRK]chi[grk][SUB]2[sub] of aromatics, Asp and Asn; [GRK]chi[grk][SUB]3[sub] of Glu",
         "and Gln; and [GRK]chi[grk][SUB]4[sub] of Arg), which are 2-fold. \"rotamer 0\" means ",
index e265d2ca43abb1f6b106d4625ceaf224737b6654..f6da5c1243cbdc8223f5ebf77efeeabe611522b9 100644 (file)
@@ -1382,32 +1382,35 @@ int gmx_cluster(int argc, char *argv[])
         "file. When writing all structures, separate numbered files are made",
         "for each cluster.[PAR]",
 
-        "Two output files are always written:[BR]",
-        "[TT]-o[tt] writes the RMSD values in the upper left half of the matrix",
-        "and a graphical depiction of the clusters in the lower right half",
-        "When [TT]-minstruct[tt] = 1 the graphical depiction is black",
-        "when two structures are in the same cluster.",
-        "When [TT]-minstruct[tt] > 1 different colors will be used for each",
-        "cluster.[BR]",
-        "[TT]-g[tt] writes information on the options used and a detailed list",
-        "of all clusters and their members.[PAR]",
-
-        "Additionally, a number of optional output files can be written:[BR]",
-        "[TT]-dist[tt] writes the RMSD distribution.[BR]",
-        "[TT]-ev[tt] writes the eigenvectors of the RMSD matrix",
-        "diagonalization.[BR]",
-        "[TT]-sz[tt] writes the cluster sizes.[BR]",
-        "[TT]-tr[tt] writes a matrix of the number transitions between",
-        "cluster pairs.[BR]",
-        "[TT]-ntr[tt] writes the total number of transitions to or from",
-        "each cluster.[BR]",
-        "[TT]-clid[tt] writes the cluster number as a function of time.[BR]",
-        "[TT]-cl[tt] writes average (with option [TT]-av[tt]) or central",
-        "structure of each cluster or writes numbered files with cluster members",
-        "for a selected set of clusters (with option [TT]-wcl[tt], depends on",
-        "[TT]-nst[tt] and [TT]-rmsmin[tt]). The center of a cluster is the",
-        "structure with the smallest average RMSD from all other structures",
-        "of the cluster.",
+        "Two output files are always written:",
+        "",
+        " * [TT]-o[tt] writes the RMSD values in the upper left half of the matrix",
+        "   and a graphical depiction of the clusters in the lower right half",
+        "   When [TT]-minstruct[tt] = 1 the graphical depiction is black",
+        "   when two structures are in the same cluster.",
+        "   When [TT]-minstruct[tt] > 1 different colors will be used for each",
+        "   cluster.",
+        " * [TT]-g[tt] writes information on the options used and a detailed list",
+        "   of all clusters and their members.",
+        "",
+
+        "Additionally, a number of optional output files can be written:",
+        "",
+        " * [TT]-dist[tt] writes the RMSD distribution.",
+        " * [TT]-ev[tt] writes the eigenvectors of the RMSD matrix",
+        "   diagonalization.",
+        " * [TT]-sz[tt] writes the cluster sizes.",
+        " * [TT]-tr[tt] writes a matrix of the number transitions between",
+        "   cluster pairs.",
+        " * [TT]-ntr[tt] writes the total number of transitions to or from",
+        "   each cluster.",
+        " * [TT]-clid[tt] writes the cluster number as a function of time.",
+        " * [TT]-cl[tt] writes average (with option [TT]-av[tt]) or central",
+        "   structure of each cluster or writes numbered files with cluster members",
+        "   for a selected set of clusters (with option [TT]-wcl[tt], depends on",
+        "   [TT]-nst[tt] and [TT]-rmsmin[tt]). The center of a cluster is the",
+        "   structure with the smallest average RMSD from all other structures",
+        "   of the cluster.",
     };
 
     FILE              *fp, *log;
index 7561aece02dacae4842ef7da2e11a03e9e15dc48..7bc7febc797aed4bbabaf518a435479d1df00b5d 100644 (file)
@@ -250,10 +250,12 @@ int gmx_dielectric(int argc, char *argv[])
         "[THISMODULE] calculates frequency dependent dielectric constants",
         "from the autocorrelation function of the total dipole moment in",
         "your simulation. This ACF can be generated by [gmx-dipoles].",
-        "The functional forms of the available functions are:[PAR]",
-        "One parameter:    y = [EXP]-a[SUB]1[sub] x[exp],[BR]",
-        "Two parameters:   y = a[SUB]2[sub] [EXP]-a[SUB]1[sub] x[exp],[BR]",
-        "Three parameters: y = a[SUB]2[sub] [EXP]-a[SUB]1[sub] x[exp] + (1 - a[SUB]2[sub]) [EXP]-a[SUB]3[sub] x[exp].[BR]",
+        "The functional forms of the available functions are:",
+        "",
+        " * One parameter:    y = [EXP]-a[SUB]1[sub] x[exp],",
+        " * Two parameters:   y = a[SUB]2[sub] [EXP]-a[SUB]1[sub] x[exp],",
+        " * Three parameters: y = a[SUB]2[sub] [EXP]-a[SUB]1[sub] x[exp] + (1 - a[SUB]2[sub]) [EXP]-a[SUB]3[sub] x[exp].",
+        "",
         "Start values for the fit procedure can be given on the command line.",
         "It is also possible to fix parameters at their start value, use [TT]-fix[tt]",
         "with the number of the parameter you want to fix.",
index 9a1e775ef66077cdc21fdb281c22ac810e1d8334..87cf30d294fd835cab5392848d06b881834344a6 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -492,7 +492,7 @@ static void update_ee_sum(int nre,
 int gmx_eneconv(int argc, char *argv[])
 {
     const char     *desc[] = {
-        "With [IT]multiple files[it] specified for the [TT]-f[tt] option:[BR]",
+        "With [IT]multiple files[it] specified for the [TT]-f[tt] option:[PAR]",
         "Concatenates several energy files in sorted order.",
         "In the case of double time frames, the one",
         "in the later file is used. By specifying [TT]-settime[tt] you will be",
@@ -500,7 +500,7 @@ int gmx_eneconv(int argc, char *argv[])
         "from the command line,",
         "such that the command [TT]gmx eneconv -f *.edr -o fixed.edr[tt] should do",
         "the trick. [PAR]",
-        "With [IT]one file[it] specified for [TT]-f[tt]:[BR]",
+        "With [IT]one file[it] specified for [TT]-f[tt]:[PAR]",
         "Reads one energy file and writes another, applying the [TT]-dt[tt],",
         "[TT]-offset[tt], [TT]-t0[tt] and [TT]-settime[tt] options and",
         "converting to a different format if necessary (indicated by file",
index 28c138b47af45651def969609a1a59fa3db61a92..f9e8fb89c662140db8fa9f98c5b8a31d357c8676 100644 (file)
@@ -3568,28 +3568,29 @@ int gmx_hbond(int argc, char *argv[])
            "note also that no check is made for the types of atoms.[PAR]",
          */
 
-        "[BB]Output:[bb][BR]",
-        "[TT]-num[tt]:  number of hydrogen bonds as a function of time.[BR]",
-        "[TT]-ac[tt]:   average over all autocorrelations of the existence",
-        "functions (either 0 or 1) of all hydrogen bonds.[BR]",
-        "[TT]-dist[tt]: distance distribution of all hydrogen bonds.[BR]",
-        "[TT]-ang[tt]:  angle distribution of all hydrogen bonds.[BR]",
-        "[TT]-hx[tt]:   the number of n-n+i hydrogen bonds as a function of time",
-        "where n and n+i stand for residue numbers and i ranges from 0 to 6.",
-        "This includes the n-n+3, n-n+4 and n-n+5 hydrogen bonds associated",
-        "with helices in proteins.[BR]",
-        "[TT]-hbn[tt]:  all selected groups, donors, hydrogens and acceptors",
-        "for selected groups, all hydrogen bonded atoms from all groups and",
-        "all solvent atoms involved in insertion.[BR]",
-        "[TT]-hbm[tt]:  existence matrix for all hydrogen bonds over all",
-        "frames, this also contains information on solvent insertion",
-        "into hydrogen bonds. Ordering is identical to that in [TT]-hbn[tt]",
-        "index file.[BR]",
-        "[TT]-dan[tt]: write out the number of donors and acceptors analyzed for",
-        "each timeframe. This is especially useful when using [TT]-shell[tt].[BR]",
-        "[TT]-nhbdist[tt]: compute the number of HBonds per hydrogen in order to",
-        "compare results to Raman Spectroscopy.",
-        "[PAR]",
+        "[BB]Output:[bb]",
+        "",
+        " * [TT]-num[tt]:  number of hydrogen bonds as a function of time.",
+        " * [TT]-ac[tt]:   average over all autocorrelations of the existence",
+        "   functions (either 0 or 1) of all hydrogen bonds.",
+        " * [TT]-dist[tt]: distance distribution of all hydrogen bonds.",
+        " * [TT]-ang[tt]:  angle distribution of all hydrogen bonds.",
+        " * [TT]-hx[tt]:   the number of n-n+i hydrogen bonds as a function of time",
+        "   where n and n+i stand for residue numbers and i ranges from 0 to 6.",
+        "   This includes the n-n+3, n-n+4 and n-n+5 hydrogen bonds associated",
+        "   with helices in proteins.",
+        " * [TT]-hbn[tt]:  all selected groups, donors, hydrogens and acceptors",
+        "   for selected groups, all hydrogen bonded atoms from all groups and",
+        "   all solvent atoms involved in insertion.",
+        " * [TT]-hbm[tt]:  existence matrix for all hydrogen bonds over all",
+        "   frames, this also contains information on solvent insertion",
+        "   into hydrogen bonds. Ordering is identical to that in [TT]-hbn[tt]",
+        "   index file.",
+        " * [TT]-dan[tt]: write out the number of donors and acceptors analyzed for",
+        "   each timeframe. This is especially useful when using [TT]-shell[tt].",
+        " * [TT]-nhbdist[tt]: compute the number of HBonds per hydrogen in order to",
+        "   compare results to Raman Spectroscopy.",
+        "",
         "Note: options [TT]-ac[tt], [TT]-life[tt], [TT]-hbn[tt] and [TT]-hbm[tt]",
         "require an amount of memory proportional to the total numbers of donors",
         "times the total number of acceptors in the selected group(s)."
index 29bab90a0742011d98fa6721915146a4c5585ea7..17c4f392f460a0d943bdc42e3e55effd98c0c4bd 100644 (file)
@@ -67,29 +67,29 @@ int gmx_helix(int argc, char *argv[])
         "hydrogen bonds and [GRK]phi[grk]/[GRK]psi[grk] angles.",
         "That bit is fitted",
         "to an ideal helix around the [IT]z[it]-axis and centered around the origin.",
-        "Then the following properties are computed:[PAR]",
-        "[BB]1.[bb] Helix radius (file [TT]radius.xvg[tt]). This is merely the",
-        "RMS deviation in two dimensions for all C[GRK]alpha[grk] atoms.",
-        "it is calculated as [SQRT]([SUM][sum][SUB]i[sub] (x^2(i)+y^2(i)))/N[sqrt] where N is the number",
-        "of backbone atoms. For an ideal helix the radius is 0.23 nm[BR]",
-        "[BB]2.[bb] Twist (file [TT]twist.xvg[tt]). The average helical angle per",
-        "residue is calculated. For an [GRK]alpha[grk]-helix it is 100 degrees,",
-        "for 3-10 helices it will be smaller, and ",
-        "for 5-helices it will be larger.[BR]",
-        "[BB]3.[bb] Rise per residue (file [TT]rise.xvg[tt]). The helical rise per",
-        "residue is plotted as the difference in [IT]z[it]-coordinate between C[GRK]alpha[grk]",
-        "atoms. For an ideal helix, this is 0.15 nm[BR]",
-        "[BB]4.[bb] Total helix length (file [TT]len-ahx.xvg[tt]). The total length",
-        "of the",
-        "helix in nm. This is simply the average rise (see above) times the",
-        "number of helical residues (see below).[BR]",
-        "[BB]5.[bb] Helix dipole, backbone only (file [TT]dip-ahx.xvg[tt]).[BR]",
-        "[BB]6.[bb] RMS deviation from ideal helix, calculated for the C[GRK]alpha[grk]",
-        "atoms only (file [TT]rms-ahx.xvg[tt]).[BR]",
-        "[BB]7.[bb] Average C[GRK]alpha[grk] - C[GRK]alpha[grk] dihedral angle (file [TT]phi-ahx.xvg[tt]).[BR]",
-        "[BB]8.[bb] Average [GRK]phi[grk] and [GRK]psi[grk] angles (file [TT]phipsi.xvg[tt]).[BR]",
-        "[BB]9.[bb] Ellipticity at 222 nm according to Hirst and Brooks.",
-        "[PAR]"
+        "Then the following properties are computed:",
+        "",
+        " * Helix radius (file [TT]radius.xvg[tt]). This is merely the",
+        "   RMS deviation in two dimensions for all C[GRK]alpha[grk] atoms.",
+        "   it is calculated as [SQRT]([SUM][sum][SUB]i[sub] (x^2(i)+y^2(i)))/N[sqrt] where N is the number",
+        "   of backbone atoms. For an ideal helix the radius is 0.23 nm.",
+        " * Twist (file [TT]twist.xvg[tt]). The average helical angle per",
+        "   residue is calculated. For an [GRK]alpha[grk]-helix it is 100 degrees,",
+        "   for 3-10 helices it will be smaller, and ",
+        "   for 5-helices it will be larger.",
+        " * Rise per residue (file [TT]rise.xvg[tt]). The helical rise per",
+        "   residue is plotted as the difference in [IT]z[it]-coordinate between C[GRK]alpha[grk]",
+        "   atoms. For an ideal helix, this is 0.15 nm.",
+        " * Total helix length (file [TT]len-ahx.xvg[tt]). The total length",
+        "   of the",
+        "   helix in nm. This is simply the average rise (see above) times the",
+        "   number of helical residues (see below).",
+        " * Helix dipole, backbone only (file [TT]dip-ahx.xvg[tt]).",
+        " * RMS deviation from ideal helix, calculated for the C[GRK]alpha[grk]",
+        "   atoms only (file [TT]rms-ahx.xvg[tt]).",
+        " * Average C[GRK]alpha[grk] - C[GRK]alpha[grk] dihedral angle (file [TT]phi-ahx.xvg[tt]).",
+        " * Average [GRK]phi[grk] and [GRK]psi[grk] angles (file [TT]phipsi.xvg[tt]).",
+        " * Ellipticity at 222 nm according to Hirst and Brooks."
     };
     static gmx_bool    bCheck = FALSE, bFit = TRUE, bDBG = FALSE, bEV = FALSE;
     static int         rStart = 0, rEnd = 0, r0 = 1;
index 2564b156dc802ecb1cf70c18773c3ba3ea1f06ed..aa95ade3eabf95d9178d445224e47620c1fce7f6 100644 (file)
@@ -628,10 +628,11 @@ int gmx_make_edi(int argc, char *argv[])
         "[BB]Note[bb] that you can impose multiple ED constraints and flooding potentials in",
         "a single simulation (on different molecules) if several [REF].edi[ref] files were concatenated",
         "first. The constraints are applied in the order they appear in the [REF].edi[ref] file. ",
-        "Depending on what was specified in the [REF].edi[ref] input file, the output file contains for each ED dataset[PAR]",
-        "[TT]*[tt] the RMSD of the fitted molecule to the reference structure (for atoms involved in fitting prior to calculating the ED constraints)[BR]",
-        "[TT]*[tt] projections of the positions onto selected eigenvectors[BR]",
-        "[PAR][PAR]",
+        "Depending on what was specified in the [REF].edi[ref] input file, the output file contains for each ED dataset",
+        "",
+        " * the RMSD of the fitted molecule to the reference structure (for atoms involved in fitting prior to calculating the ED constraints)",
+        " * projections of the positions onto selected eigenvectors",
+        "",
         "FLOODING:[PAR]",
         "with [TT]-flood[tt], you can specify which eigenvectors are used to compute a flooding potential,",
         "which will lead to extra forces expelling the structure out of the region described",
index 7de848e5ebe73c76276f13d020e7094b0b112742..9b0f9e20a55881976b3d86ea1866d5af652b5426 100644 (file)
@@ -145,12 +145,14 @@ int gmx_sorient(int argc, char *argv[])
     const char     *desc[] = {
         "[THISMODULE] analyzes solvent orientation around solutes.",
         "It calculates two angles between the vector from one or more",
-        "reference positions to the first atom of each solvent molecule:[PAR]",
-        "[GRK]theta[grk][SUB]1[sub]: the angle with the vector from the first atom of the solvent",
-        "molecule to the midpoint between atoms 2 and 3.[BR]",
-        "[GRK]theta[grk][SUB]2[sub]: the angle with the normal of the solvent plane, defined by the",
-        "same three atoms, or, when the option [TT]-v23[tt] is set, ",
-        "the angle with the vector between atoms 2 and 3.[PAR]",
+        "reference positions to the first atom of each solvent molecule:",
+        "",
+        " * [GRK]theta[grk][SUB]1[sub]: the angle with the vector from the first atom of the solvent",
+        "   molecule to the midpoint between atoms 2 and 3.",
+        " * [GRK]theta[grk][SUB]2[sub]: the angle with the normal of the solvent plane, defined by the",
+        "   same three atoms, or, when the option [TT]-v23[tt] is set, ",
+        "   the angle with the vector between atoms 2 and 3.",
+        "",
         "The reference can be a set of atoms or",
         "the center of mass of a set of atoms. The group of solvent atoms should",
         "consist of 3 atoms per solvent molecule.",
index 4fa6fd76b6ee00560785bc8ef7ebc9f15fc4650c..b1c7a5ed51910d4a73aff9446e4ed8bcb4e1b9d4 100644 (file)
@@ -584,24 +584,25 @@ static gmx_mtop_t *read_mtop_for_tng(const char *tps_file,
 int gmx_trjconv(int argc, char *argv[])
 {
     const char *desc[] = {
-        "[THISMODULE] can convert trajectory files in many ways:[BR]",
-        "* from one format to another[BR]",
-        "* select a subset of atoms[BR]",
-        "* change the periodicity representation[BR]",
-        "* keep multimeric molecules together[BR]",
-        "* center atoms in the box[BR]",
-        "* fit atoms to reference structure[BR]",
-        "* reduce the number of frames[BR]",
-        "* change the timestamps of the frames ([TT]-t0[tt] and [TT]-timestep[tt])[BR]",
-        "[TT]*[tt] cut the trajectory in small subtrajectories according",
-        "to information in an index file. This allows subsequent analysis of",
-        "the subtrajectories that could, for example, be the result of a",
-        "cluster analysis. Use option [TT]-sub[tt].",
-        "This assumes that the entries in the index file are frame numbers and",
-        "dumps each group in the index file to a separate trajectory file.[BR]",
-        "[TT]*[tt] select frames within a certain range of a quantity given",
-        "in an [REF].xvg[ref] file.[PAR]",
-
+        "[THISMODULE] can convert trajectory files in many ways:",
+        "",
+        "* from one format to another",
+        "* select a subset of atoms",
+        "* change the periodicity representation",
+        "* keep multimeric molecules together",
+        "* center atoms in the box",
+        "* fit atoms to reference structure",
+        "* reduce the number of frames",
+        "* change the timestamps of the frames ([TT]-t0[tt] and [TT]-timestep[tt])",
+        "* cut the trajectory in small subtrajectories according",
+        "  to information in an index file. This allows subsequent analysis of",
+        "  the subtrajectories that could, for example, be the result of a",
+        "  cluster analysis. Use option [TT]-sub[tt].",
+        "  This assumes that the entries in the index file are frame numbers and",
+        "  dumps each group in the index file to a separate trajectory file.",
+        "* select frames within a certain range of a quantity given",
+        "  in an [REF].xvg[ref] file.",
+        "",
         "[gmx-trjcat] is better suited for concatenating multiple trajectory files.",
         "[PAR]",
 
@@ -643,28 +644,31 @@ int gmx_trjconv(int argc, char *argv[])
         "conformational transitions.[PAR]",
 
         "Option [TT]-pbc[tt] sets the type of periodic boundary condition",
-        "treatment:[BR]",
-        "[TT]* mol[tt] puts the center of mass of molecules in the box,",
-        "and requires a run input file to be supplied with [TT]-s[tt].[BR]",
-        "[TT]* res[tt] puts the center of mass of residues in the box.[BR]",
-        "[TT]* atom[tt] puts all the atoms in the box.[BR]",
-        "[TT]* nojump[tt] checks if atoms jump across the box and then puts",
-        "them back. This has the effect that all molecules",
-        "will remain whole (provided they were whole in the initial",
-        "conformation). [BB]Note[bb] that this ensures a continuous trajectory but",
-        "molecules may diffuse out of the box. The starting configuration",
-        "for this procedure is taken from the structure file, if one is",
-        "supplied, otherwise it is the first frame.[BR]",
-        "[TT]* cluster[tt] clusters all the atoms in the selected index",
-        "such that they are all closest to the center of mass of the cluster,",
-        "which is iteratively updated. [BB]Note[bb] that this will only give meaningful",
-        "results if you in fact have a cluster. Luckily that can be checked",
-        "afterwards using a trajectory viewer. Note also that if your molecules",
-        "are broken this will not work either.[BR]",
-        "The separate option [TT]-clustercenter[tt] can be used to specify an",
-        "approximate center for the cluster. This is useful e.g. if you have",
-        "two big vesicles, and you want to maintain their relative positions.[BR]",
-        "[TT]* whole[tt] only makes broken molecules whole.[PAR]",
+        "treatment:",
+        "",
+        " * [TT]mol[tt] puts the center of mass of molecules in the box,",
+        "   and requires a run input file to be supplied with [TT]-s[tt].",
+        " * [TT]res[tt] puts the center of mass of residues in the box.",
+        " * [TT]atom[tt] puts all the atoms in the box.",
+        " * [TT]nojump[tt] checks if atoms jump across the box and then puts",
+        "   them back. This has the effect that all molecules",
+        "   will remain whole (provided they were whole in the initial",
+        "   conformation). [BB]Note[bb] that this ensures a continuous trajectory but",
+        "   molecules may diffuse out of the box. The starting configuration",
+        "   for this procedure is taken from the structure file, if one is",
+        "   supplied, otherwise it is the first frame.",
+        " * [TT]cluster[tt] clusters all the atoms in the selected index",
+        "   such that they are all closest to the center of mass of the cluster,",
+        "   which is iteratively updated. [BB]Note[bb] that this will only give meaningful",
+        "   results if you in fact have a cluster. Luckily that can be checked",
+        "   afterwards using a trajectory viewer. Note also that if your molecules",
+        "   are broken this will not work either.",
+        "",
+        "   The separate option [TT]-clustercenter[tt] can be used to specify an",
+        "   approximate center for the cluster. This is useful e.g. if you have",
+        "   two big vesicles, and you want to maintain their relative positions.",
+        " * [TT]whole[tt] only makes broken molecules whole.",
+        "",
 
         "Option [TT]-ur[tt] sets the unit cell representation for options",
         "[TT]mol[tt], [TT]res[tt] and [TT]atom[tt] of [TT]-pbc[tt].",
index 6110cf64cbb3df79630ea8544a3eaad90eb05989..b3ef53bcfd4a09e32eaed71a524cd1eb99462327 100644 (file)
@@ -3129,38 +3129,41 @@ int gmx_wham(int argc, char *argv[])
         "[THISMODULE] is an analysis program that implements the Weighted",
         "Histogram Analysis Method (WHAM). It is intended to analyze",
         "output files generated by umbrella sampling simulations to ",
-        "compute a potential of mean force (PMF). [PAR] ",
-        "At present, three input modes are supported.[BR]",
-        "[TT]*[tt] With option [TT]-it[tt], the user provides a file which contains the",
-        " file names of the umbrella simulation run-input files ([REF].tpr[ref] files),",
-        " AND, with option [TT]-ix[tt], a file which contains file names of",
-        " the pullx [TT]mdrun[tt] output files. The [REF].tpr[ref] and pullx files must",
-        " be in corresponding order, i.e. the first [REF].tpr[ref] created the",
-        " first pullx, etc.[BR]",
-        "[TT]*[tt] Same as the previous input mode, except that the the user",
-        " provides the pull force output file names ([TT]pullf.xvg[tt]) with option [TT]-if[tt].",
-        " From the pull force the position in the umbrella potential is",
-        " computed. This does not work with tabulated umbrella potentials.[BR]"
-        "[TT]*[tt] With option [TT]-ip[tt], the user provides file names of (gzipped) [REF].pdo[ref] files, i.e.",
-        " the GROMACS 3.3 umbrella output files. If you have some unusual"
-        " reaction coordinate you may also generate your own [REF].pdo[ref] files and",
-        " feed them with the [TT]-ip[tt] option into to [THISMODULE]. The [REF].pdo[ref] file header",
-        " must be similar to the following::",
+        "compute a potential of mean force (PMF).",
         "",
-        "    # UMBRELLA      3.0",
-        "    # Component selection: 0 0 1",
-        "    # nSkip 1",
-        "    # Ref. Group 'TestAtom'",
-        "    # Nr. of pull groups 2",
-        "    # Group 1 'GR1'  Umb. Pos. 5.0 Umb. Cons. 1000.0",
-        "    # Group 2 'GR2'  Umb. Pos. 2.0 Umb. Cons. 500.0",
-        "    #####",
+        "At present, three input modes are supported.",
+        "",
+        " * With option [TT]-it[tt], the user provides a file which contains the",
+        "   file names of the umbrella simulation run-input files ([REF].tpr[ref] files),",
+        "   AND, with option [TT]-ix[tt], a file which contains file names of",
+        "   the pullx [TT]mdrun[tt] output files. The [REF].tpr[ref] and pullx files must",
+        "   be in corresponding order, i.e. the first [REF].tpr[ref] created the",
+        "   first pullx, etc.",
+        " * Same as the previous input mode, except that the the user",
+        "   provides the pull force output file names ([TT]pullf.xvg[tt]) with option [TT]-if[tt].",
+        "   From the pull force the position in the umbrella potential is",
+        "   computed. This does not work with tabulated umbrella potentials.",
+        " * With option [TT]-ip[tt], the user provides file names of (gzipped) [REF].pdo[ref] files, i.e.",
+        "   the GROMACS 3.3 umbrella output files. If you have some unusual"
+        "   reaction coordinate you may also generate your own [REF].pdo[ref] files and",
+        "   feed them with the [TT]-ip[tt] option into to [THISMODULE]. The [REF].pdo[ref] file header",
+        "   must be similar to the following::",
+        "",
+        "     # UMBRELLA      3.0",
+        "     # Component selection: 0 0 1",
+        "     # nSkip 1",
+        "     # Ref. Group 'TestAtom'",
+        "     # Nr. of pull groups 2",
+        "     # Group 1 'GR1'  Umb. Pos. 5.0 Umb. Cons. 1000.0",
+        "     # Group 2 'GR2'  Umb. Pos. 2.0 Umb. Cons. 500.0",
+        "     #####",
+        "",
+        "   The number of pull groups, umbrella positions, force constants, and names ",
+        "   may (of course) differ. Following the header, a time column and ",
+        "   a data column for each pull group follows (i.e. the displacement",
+        "   with respect to the umbrella center). Up to four pull groups are possible ",
+        "   per [REF].pdo[ref] file at present.",
         "",
-        "The number of pull groups, umbrella positions, force constants, and names ",
-        "may (of course) differ. Following the header, a time column and ",
-        "a data column for each pull group follows (i.e. the displacement",
-        "with respect to the umbrella center). Up to four pull groups are possible ",
-        "per [REF].pdo[ref] file at present.[PAR]",
         "By default, all pull groups found in all pullx/pullf files are used in WHAM. If only ",
         "some of the pull groups should be used, a pull group selection file (option [TT]-is[tt]) can ",
         "be provided. The selection file must contain one line for each tpr file in tpr-files.dat.",
@@ -3173,19 +3176,23 @@ int gmx_wham(int argc, char *argv[])
         "    1 1 0 0",
         "    1 1 0 0",
         "",
-        "By default, the output files are[BR]",
-        "  [TT]-o[tt]      PMF output file[BR]",
-        "  [TT]-hist[tt]   Histograms output file[BR]",
+        "By default, the output files are",
+        "",
+        " * [TT]-o[tt]      PMF output file",
+        " * [TT]-hist[tt]   Histograms output file",
+        "",
         "Always check whether the histograms sufficiently overlap.[PAR]",
         "The umbrella potential is assumed to be harmonic and the force constants are ",
         "read from the [REF].tpr[ref] or [REF].pdo[ref] files. If a non-harmonic umbrella force was applied ",
         "a tabulated potential can be provided with [TT]-tab[tt].[PAR]",
         "WHAM OPTIONS[BR]------------[BR]",
-        "  [TT]-bins[tt]   Number of bins used in analysis[BR]",
-        "  [TT]-temp[tt]   Temperature in the simulations[BR]",
-        "  [TT]-tol[tt]    Stop iteration if profile (probability) changed less than tolerance[BR]",
-        "  [TT]-auto[tt]   Automatic determination of boundaries[BR]",
-        "  [TT]-min,-max[tt]   Boundaries of the profile [BR]",
+        "",
+        " * [TT]-bins[tt]   Number of bins used in analysis",
+        " * [TT]-temp[tt]   Temperature in the simulations",
+        " * [TT]-tol[tt]    Stop iteration if profile (probability) changed less than tolerance",
+        " * [TT]-auto[tt]   Automatic determination of boundaries",
+        " * [TT]-min,-max[tt]   Boundaries of the profile",
+        "",
         "The data points that are used to compute the profile",
         "can be restricted with options [TT]-b[tt], [TT]-e[tt], and [TT]-dt[tt]. ",
         "Adjust [TT]-b[tt] to ensure sufficient equilibration in each ",
@@ -3222,38 +3229,42 @@ int gmx_wham(int argc, char *argv[])
         "Statistical errors may be estimated with bootstrap analysis. Use it with care, ",
         "otherwise the statistical error may be substantially underestimated. ",
         "More background and examples for the bootstrap technique can be found in ",
-        "Hub, de Groot and Van der Spoel, JCTC (2010) 6: 3713-3720.[BR]",
+        "Hub, de Groot and Van der Spoel, JCTC (2010) 6: 3713-3720.",
         "[TT]-nBootstrap[tt] defines the number of bootstraps (use, e.g., 100). ",
         "Four bootstrapping methods are supported and ",
-        "selected with [TT]-bs-method[tt].[BR]",
-        "(1) [TT]b-hist[tt]   Default: complete histograms are considered as independent ",
-        "data points, and the bootstrap is carried out by assigning random weights to the ",
-        "histograms (\"Bayesian bootstrap\"). Note that each point along the reaction coordinate",
-        "must be covered by multiple independent histograms (e.g. 10 histograms), otherwise the ",
-        "statistical error is underestimated.[BR]",
-        "(2) [TT]hist[tt]    Complete histograms are considered as independent data points. ",
-        "For each bootstrap, N histograms are randomly chosen from the N given histograms ",
-        "(allowing duplication, i.e. sampling with replacement).",
-        "To avoid gaps without data along the reaction coordinate blocks of histograms ",
-        "([TT]-histbs-block[tt]) may be defined. In that case, the given histograms are ",
-        "divided into blocks and only histograms within each block are mixed. Note that ",
-        "the histograms within each block must be representative for all possible histograms, ",
-        "otherwise the statistical error is underestimated.[BR]",
-        "(3) [TT]traj[tt]  The given histograms are used to generate new random trajectories,",
-        "such that the generated data points are distributed according the given histograms ",
-        "and properly autocorrelated. The autocorrelation time (ACT) for each window must be ",
-        "known, so use [TT]-ac[tt] or provide the ACT with [TT]-iiact[tt]. If the ACT of all ",
-        "windows are identical (and known), you can also provide them with [TT]-bs-tau[tt]. ",
-        "Note that this method may severely underestimate the error in case of limited sampling, ",
-        "that is if individual histograms do not represent the complete phase space at ",
-        "the respective positions.[BR]",
-        "(4) [TT]traj-gauss[tt]  The same as method [TT]traj[tt], but the trajectories are ",
-        "not bootstrapped from the umbrella histograms but from Gaussians with the average ",
-        "and width of the umbrella histograms. That method yields similar error estimates ",
-        "like method [TT]traj[tt].[PAR]"
-        "Bootstrapping output:[BR]",
-        "  [TT]-bsres[tt]   Average profile and standard deviations[BR]",
-        "  [TT]-bsprof[tt]  All bootstrapping profiles[BR]",
+        "selected with [TT]-bs-method[tt].",
+        "",
+        " * [TT]b-hist[tt]   Default: complete histograms are considered as independent ",
+        "   data points, and the bootstrap is carried out by assigning random weights to the ",
+        "   histograms (\"Bayesian bootstrap\"). Note that each point along the reaction coordinate",
+        "   must be covered by multiple independent histograms (e.g. 10 histograms), otherwise the ",
+        "   statistical error is underestimated.",
+        " * [TT]hist[tt]    Complete histograms are considered as independent data points. ",
+        "   For each bootstrap, N histograms are randomly chosen from the N given histograms ",
+        "   (allowing duplication, i.e. sampling with replacement).",
+        "   To avoid gaps without data along the reaction coordinate blocks of histograms ",
+        "   ([TT]-histbs-block[tt]) may be defined. In that case, the given histograms are ",
+        "   divided into blocks and only histograms within each block are mixed. Note that ",
+        "   the histograms within each block must be representative for all possible histograms, ",
+        "   otherwise the statistical error is underestimated.",
+        " * [TT]traj[tt]  The given histograms are used to generate new random trajectories,",
+        "   such that the generated data points are distributed according the given histograms ",
+        "   and properly autocorrelated. The autocorrelation time (ACT) for each window must be ",
+        "   known, so use [TT]-ac[tt] or provide the ACT with [TT]-iiact[tt]. If the ACT of all ",
+        "   windows are identical (and known), you can also provide them with [TT]-bs-tau[tt]. ",
+        "   Note that this method may severely underestimate the error in case of limited sampling, ",
+        "   that is if individual histograms do not represent the complete phase space at ",
+        "   the respective positions.",
+        " * [TT]traj-gauss[tt]  The same as method [TT]traj[tt], but the trajectories are ",
+        "   not bootstrapped from the umbrella histograms but from Gaussians with the average ",
+        "   and width of the umbrella histograms. That method yields similar error estimates ",
+        "   like method [TT]traj[tt].",
+        "",
+        "Bootstrapping output:",
+        "",
+        " * [TT]-bsres[tt]   Average profile and standard deviations",
+        " * [TT]-bsprof[tt]  All bootstrapping profiles",
+        "",
         "With [TT]-vbs[tt] (verbose bootstrapping), the histograms of each bootstrap are written, ",
         "and, with bootstrap method [TT]traj[tt], the cumulative distribution functions of ",
         "the histograms."
index 19eae3db9131034672193166889e64bbe08ca071..b7bc9c2308e406f8ef40bae13a64221ec62b8e30 100644 (file)
@@ -539,13 +539,15 @@ void HelpWriterContext::Impl::processMarkup(const std::string &text,
     {
         case eHelpOutputFormat_Console:
         {
+            const int   baseFirstLineIndent = wrapper->settings().firstLineIndent();
+            const int   baseIndent          = wrapper->settings().indent();
             result = repall(result, sandrTty);
             result = replaceLinks(result);
             std::string paragraph;
             paragraph.reserve(result.length());
-            size_t      i        = 0;
-            bool        bFirst   = true;
-            bool        bLiteral = false;
+            size_t      i             = 0;
+            int         nextBreakSize = 0;
+            bool        bLiteral      = false;
             while (i < result.length())
             {
                 while (i < result.length() && result[i] == '\n')
@@ -556,13 +558,31 @@ void HelpWriterContext::Impl::processMarkup(const std::string &text,
                 {
                     break;
                 }
+                const int breakSize     = nextBreakSize;
+                int       currentLine   = 0;
+                bool      bLineStart    = true;
+                int       currentIndent = 0;
+                int       firstIndent   = 0;
+                int       indent        = 0;
                 paragraph.clear();
-                for (; i < result.length(); ++i)
+                for (;; ++i)
                 {
-                    if (result[i] == '\n')
+                    if (result[i] == '\n' || i == result.length())
                     {
-                        if (i + 1 == result.length() || result[i + 1] == '\n')
+                        if (currentLine == 0)
                         {
+                            firstIndent = currentIndent;
+                        }
+                        else if (currentLine == 1)
+                        {
+                            indent = currentIndent;
+                        }
+                        ++currentLine;
+                        bLineStart    = true;
+                        currentIndent = 0;
+                        if (i + 1 >= result.length() || result[i + 1] == '\n')
+                        {
+                            nextBreakSize = 2;
                             break;
                         }
                         if (!bLiteral)
@@ -574,6 +594,30 @@ void HelpWriterContext::Impl::processMarkup(const std::string &text,
                             continue;
                         }
                     }
+                    else if (bLineStart)
+                    {
+                        if (std::isspace(result[i]))
+                        {
+                            ++currentIndent;
+                            continue;
+                        }
+                        else if (i + 1 < result.length()
+                                 && result[i] == '*' && result[i + 1] == ' ')
+                        {
+                            if (currentLine > 0)
+                            {
+                                while (i > 0 && result[i - 1] != '\n')
+                                {
+                                    --i;
+                                }
+                                paragraph     = stripString(paragraph);
+                                nextBreakSize = 1;
+                                break;
+                            }
+                            indent = currentIndent + 2;
+                        }
+                        bLineStart = false;
+                    }
                     paragraph.push_back(result[i]);
                 }
                 if (endsWith(paragraph, "::"))
@@ -596,12 +640,15 @@ void HelpWriterContext::Impl::processMarkup(const std::string &text,
                 {
                     bLiteral = false;
                 }
-                if (!bFirst)
+                if (breakSize > 0)
                 {
-                    wrapper->wrap("\n\n");
+                    wrapper->wrap(std::string(breakSize, '\n'));
                 }
+                wrapper->settings().setFirstLineIndent(baseFirstLineIndent + firstIndent);
+                wrapper->settings().setIndent(baseIndent + indent);
                 wrapper->wrap(paragraph);
-                bFirst = false;
+                wrapper->settings().setFirstLineIndent(baseFirstLineIndent);
+                wrapper->settings().setIndent(baseIndent);
             }
             break;
         }
index 184e6e76e2cda16339a24b6e2407bb611864de9f..ed08fb84b070f015025f0627a8d3f2c8e1c91b2e 100644 (file)
@@ -155,4 +155,22 @@ TEST_F(HelpWriterContextTest, FormatsLiteralText)
     testFormatting(text);
 }
 
+TEST_F(HelpWriterContextTest, FormatsBulletList)
+{
+    const char *const text[] = {
+        "Sample list:",
+        "",
+        " * first item",
+        " * second item that",
+        "   spans multiple lines",
+        " * third item that has a single long line",
+        "",
+        "Normal paragraph"
+    };
+    // Wrapping to rst with a fixed line length does not currently work
+    // correctly, but it is not used, either.
+    settings_.setLineLength(15);
+    testFormatting(text);
+}
+
 } // namespace
diff --git a/src/gromacs/onlinehelp/tests/refdata/HelpWriterContextTest_FormatsBulletList.xml b/src/gromacs/onlinehelp/tests/refdata/HelpWriterContextTest_FormatsBulletList.xml
new file mode 100644 (file)
index 0000000..2bceed2
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <String Name="Console"><![CDATA[
+Sample list:
+
+ * first item
+ * second item
+   that spans
+   multiple
+   lines
+ * third item
+   that has a
+   single long
+   line
+
+Normal
+paragraph]]></String>
+  <String Name="reStructuredText"><![CDATA[
+Sample list:
+
+ * first item
+ * second item
+that
+   spans
+multiple lines
+ * third item
+that has a
+single long
+line
+
+Normal
+paragraph]]></String>
+</ReferenceData>
index 4171382bbe9d94b4db71b0e54b2ad33bd8525d6a..b9662326800f103d59568e34dd4b91e1d5d580ec 100644 (file)
@@ -155,11 +155,13 @@ const char *const CmdLineHelpText::text[] = {
     "directory, it is used instead of the one provided by default.[PAR]",
 
     "Depending on the tool, two additional command-line arguments may be",
-    "available to control the behavior:[BR]",
-    "1. [TT]-seltype[tt] can be used to specify the default type of",
-    "positions to calculate for each selection.[BR]",
-    "2. [TT]-selrpos[tt] can be used to specify the default type of",
-    "positions used in selecting atoms by coordinates.[BR]",
+    "available to control the behavior:",
+    "",
+    " * [TT]-seltype[tt] can be used to specify the default type of",
+    "   positions to calculate for each selection.",
+    " * [TT]-selrpos[tt] can be used to specify the default type of",
+    "   positions used in selecting atoms by coordinates.",
+    "",
     "See the \"positions\" subtopic for more information on these options.",
 };
 
@@ -399,20 +401,22 @@ const char *const SyntaxHelpText::text[] = {
     "([TT]POS_EXPR[tt]s), and those that evaluate to numeric values",
     "([TT]NUM_EXPR[tt]s). Each selection should be a [TT]POS_EXPR[tt]",
     "or a [TT]ATOM_EXPR[tt] (the latter is automatically converted to",
-    "positions). The basic rules are as follows:[BR]",
-    "1. An expression like [TT]NUM_EXPR1 < NUM_EXPR2[tt] evaluates to an",
-    "[TT]ATOM_EXPR[tt] that selects all the atoms for which the comparison",
-    "is true.[BR]",
-    "2. Atom expressions can be combined with boolean operations such as",
-    "[TT]not ATOM_EXPR[tt], [TT]ATOM_EXPR and ATOM_EXPR[tt], or",
-    "[TT]ATOM_EXPR or ATOM_EXPR[tt]. Parentheses can be used to alter the",
-    "evaluation order.[BR]",
-    "3. [TT]ATOM_EXPR[tt] expressions can be converted into [TT]POS_EXPR[tt]",
-    "expressions in various ways, see the \"positions\" subtopic for more",
-    "details.[BR]",
-    "4. [TT]POS_EXPR[tt] can be converted into [TT]NUM_EXPR[tt] using syntax",
-    "like \"x of POS_EXPR\". Currently, this is only supported for single",
-    "positions like in expression \"x of cog of ATOM_EXPR\".[PAR]",
+    "positions). The basic rules are as follows:",
+    "",
+    " * An expression like [TT]NUM_EXPR1 < NUM_EXPR2[tt] evaluates to an",
+    "   [TT]ATOM_EXPR[tt] that selects all the atoms for which the comparison",
+    "   is true.",
+    " * Atom expressions can be combined with boolean operations such as",
+    "   [TT]not ATOM_EXPR[tt], [TT]ATOM_EXPR and ATOM_EXPR[tt], or",
+    "   [TT]ATOM_EXPR or ATOM_EXPR[tt]. Parentheses can be used to alter the",
+    "   evaluation order.",
+    " * [TT]ATOM_EXPR[tt] expressions can be converted into [TT]POS_EXPR[tt]",
+    "   expressions in various ways, see the \"positions\" subtopic for more",
+    "   details.",
+    " * [TT]POS_EXPR[tt] can be converted into [TT]NUM_EXPR[tt] using syntax",
+    "   like \"x of POS_EXPR\". Currently, this is only supported for single",
+    "   positions like in expression \"x of cog of ATOM_EXPR\".",
+    "",
 
     "Some keywords select atoms based on string values such as the atom name.",
     "For these keywords, it is possible to use wildcards ([TT]name \"C*\"[tt])",