From: Eric S Fraga <e.fraga@ucl.ac.uk>
To: emacs-orgmode@gnu.org
Subject: [bug] cannot extract just one column of table for use in gnuplot src block
Date: Sun, 23 Mar 2014 15:44:27 +0000 [thread overview]
Message-ID: <871txs2a3o.fsf@ucl.ac.uk> (raw)
[-- Attachment #1: Type: text/plain, Size: 35 bytes --]
Hello,
with this simple example,
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: examplebug.org --]
[-- Type: text/x-org, Size: 834 bytes --]
#+TITLE: examplebug.org
#+AUTHOR: Eric S Fraga
* table references
#+tblname: mytable
| | A | B | C | D | E | F | G | H | I | Total |
|---+---+---+---+---+---+---+---+---+---+-------|
| 1 | 1 | 1 | | | 0 | | | 1 | | 3 |
| 2 | 1 | | | | 0 | | | 1 | | 2 |
| 3 | | | 2 | 1 | 0 | | | 1 | | 4 |
| 4 | | | 2 | 1 | | | | 1 | | 4 |
| 5 | | | 2 | | | | | | | 2 |
| 6 | | | | | | 1 | | | | 1 |
| 7 | | | | | | | 0 | | | 0 |
| 8 | | | | | | | | | 2 | 2 |
|---+---+---+---+---+---+---+---+---+---+-------|
#+TBLFM: $1=1+@-1::$11=vsum($2..$10)
#+begin_src gnuplot :var data=mytable[1:-1,10] :file histogram.pdf
set xrange [-0.5:25.5]
set yrange [0:4.2]
plot data with histograms notitle
#+end_src
[-- Attachment #3: Type: text/plain, Size: 710 bytes --]
where I am trying to plot out the last column using a histogram plot in
gnuplot, org fails with an error:
Debugger entered--Lisp error: (wrong-type-argument sequencep 3)
where the last function invoked was "orgtbl-format-line(3)".
The trace is attached. This is with org up to date as of a few minutes ago.
The trace shows that the column has been extracted exactly as I
wish. However, it would appear that the function may expect a sequence
and not just a single element? If I try to extract more than just one
column, everything is fine (although obviously the gnuplot directives
need to change...).
thanks,
eric
--
: Eric S Fraga (0xFFFCF67D), Emacs 24.4.50.2, Org release_8.2.5h-831-gcb9172-git
[-- Attachment #4: trace.txt --]
[-- Type: text/plain, Size: 17234 bytes --]
Debugger entered--Lisp error: (wrong-type-argument sequencep 3)
mapcar((lambda (f) (setq i (1+ i)) (let* ((efmt (orgtbl-get-fmt *orgtbl-efmt* i)) (f (if (and efmt (string-match orgtbl-exp-regexp f)) (orgtbl-apply-fmt efmt (match-string 1 f) (match-string 2 f)) f))) (orgtbl-apply-fmt (or (orgtbl-get-fmt *orgtbl-fmt* i) *orgtbl-default-fmt*) f))) 3)
(let* ((i 0) (line (mapcar (function (lambda (f) (setq i (1+ i)) (let* (... ...) (orgtbl-apply-fmt ... f)))) line))) (setq *orgtbl-rtn* (cons (if *orgtbl-lfmt* (apply (function orgtbl-apply-fmt) *orgtbl-lfmt* line) (concat (orgtbl-eval-str *orgtbl-lstart*) (mapconcat (quote identity) line *orgtbl-sep*) (orgtbl-eval-str *orgtbl-lend*))) *orgtbl-rtn*)))
(if (eq line (quote hline)) (if *orgtbl-hline* (setq *orgtbl-rtn* (cons *orgtbl-hline* *orgtbl-rtn*))) (let* ((i 0) (line (mapcar (function (lambda (f) (setq i ...) (let* ... ...))) line))) (setq *orgtbl-rtn* (cons (if *orgtbl-lfmt* (apply (function orgtbl-apply-fmt) *orgtbl-lfmt* line) (concat (orgtbl-eval-str *orgtbl-lstart*) (mapconcat (quote identity) line *orgtbl-sep*) (orgtbl-eval-str *orgtbl-lend*))) *orgtbl-rtn*))))
orgtbl-format-line(3)
(if prevline (orgtbl-format-line prevline))
(while (not (eq (car *orgtbl-table*) section-stopper)) (if prevline (orgtbl-format-line prevline)) (setq prevline (car-safe (prog1 *orgtbl-table* (setq *orgtbl-table* (cdr *orgtbl-table*))))))
(progn (while (not (eq (car *orgtbl-table*) section-stopper)) (if prevline (orgtbl-format-line prevline)) (setq prevline (car-safe (prog1 *orgtbl-table* (setq *orgtbl-table* (cdr *orgtbl-table*)))))) (if prevline (let ((*orgtbl-lstart* *orgtbl-llstart*) (*orgtbl-lend* *orgtbl-llend*) (*orgtbl-lfmt* *orgtbl-llfmt*)) (orgtbl-format-line prevline))))
(let (prevline) (progn (while (not (eq (car *orgtbl-table*) section-stopper)) (if prevline (orgtbl-format-line prevline)) (setq prevline (car-safe (prog1 *orgtbl-table* (setq *orgtbl-table* (cdr *orgtbl-table*)))))) (if prevline (let ((*orgtbl-lstart* *orgtbl-llstart*) (*orgtbl-lend* *orgtbl-llend*) (*orgtbl-lfmt* *orgtbl-llfmt*)) (orgtbl-format-line prevline)))))
orgtbl-format-section(nil)
(let* ((splicep (plist-get params :splice)) (hline (plist-get params :hline)) (skipheadrule (plist-get params :skipheadrule)) (remove-nil-linesp (plist-get params :remove-nil-lines)) (remove-newlines (plist-get params :remove-newlines)) (*orgtbl-hline* hline) (*orgtbl-table* table) (*orgtbl-sep* (plist-get params :sep)) (*orgtbl-efmt* (plist-get params :efmt)) (*orgtbl-lstart* (plist-get params :lstart)) (*orgtbl-llstart* (or (plist-get params :llstart) *orgtbl-lstart*)) (*orgtbl-lend* (plist-get params :lend)) (*orgtbl-llend* (or (plist-get params :llend) *orgtbl-lend*)) (*orgtbl-lfmt* (plist-get params :lfmt)) (*orgtbl-llfmt* (or (plist-get params :llfmt) *orgtbl-lfmt*)) (*orgtbl-fmt* (plist-get params :fmt)) *orgtbl-rtn*) (if backend (progn (setq *orgtbl-table* (mapcar (function (lambda (r) (if ... ... r))) *orgtbl-table*)))) (if splicep nil (if (plist-member params :tstart) (progn (let ((tstart (orgtbl-eval-str ...))) (if tstart (setq *orgtbl-rtn* (cons tstart *orgtbl-rtn*))))))) (if (and (not splicep) (or (consp (car *orgtbl-table*)) (consp (nth 1 *orgtbl-table*))) (memq (quote hline) (cdr *orgtbl-table*))) (progn (if (eq (quote hline) (car *orgtbl-table*)) (progn (and hline (setq *orgtbl-rtn* (cons hline *orgtbl-rtn*))) (car-safe (prog1 *orgtbl-table* (setq *orgtbl-table* ...))))) (let* ((*orgtbl-lstart* (or (plist-get params :hlstart) *orgtbl-lstart*)) (*orgtbl-llstart* (or (plist-get params :hllstart) *orgtbl-llstart*)) (*orgtbl-lend* (or (plist-get params :hlend) *orgtbl-lend*)) (*orgtbl-llend* (or (plist-get params :hllend) (plist-get params :hlend) *orgtbl-llend*)) (*orgtbl-lfmt* (or (plist-get params :hlfmt) *orgtbl-lfmt*)) (*orgtbl-llfmt* (or (plist-get params :hllfmt) (plist-get params :hlfmt) *orgtbl-llfmt*)) (*orgtbl-sep* (or (plist-get params :hlsep) *orgtbl-sep*)) (*orgtbl-fmt* (or (plist-get params :hfmt) *orgtbl-fmt*))) (orgtbl-format-section (quote hline))) (if (and hline (not skipheadrule)) (setq *orgtbl-rtn* (cons hline *orgtbl-rtn*))) (car-safe (prog1 *orgtbl-table* (setq *orgtbl-table* (cdr *orgtbl-table*)))))) (orgtbl-format-section nil) (if splicep nil (if (plist-member params :tend) (progn (let ((tend (orgtbl-eval-str ...))) (if tend (setq *orgtbl-rtn* (cons tend *orgtbl-rtn*))))))) (mapconcat (if remove-newlines (function (lambda (tend) (replace-regexp-in-string "[\n\r \f]" "\\\\n" tend))) (quote identity)) (nreverse (if remove-nil-linesp (remq nil *orgtbl-rtn*) *orgtbl-rtn*)) "\n"))
orgtbl-to-generic((3 2 4 4 2 1 0 2) (:sep " " :fmt org-babel-gnuplot-quote-tsv-field (:comments . "") (:shebang . "") (:cache . "no") (:padline . "") (:noweb . "no") (:tangle . "no") (:exports . "results") (:results . "file replace") (:var data 3 2 4 4 2 1 0 2) (:hlines . "no") (:session) (:file . "histogram.pdf") (:result-type . value) (:result-params "file" "replace") (:rowname-names) (:colname-names)))
(insert (orgtbl-to-generic table (org-combine-plists (quote (:sep " " :fmt org-babel-gnuplot-quote-tsv-field)) params)))
(save-current-buffer (set-buffer temp-buffer) (make-local-variable (quote org-babel-gnuplot-timestamp-fmt)) (setq org-babel-gnuplot-timestamp-fmt (or (plist-get params :timefmt) "%Y-%m-%d-%H:%M:%S")) (insert (orgtbl-to-generic table (org-combine-plists (quote (:sep " " :fmt org-babel-gnuplot-quote-tsv-field)) params))))
(prog1 (save-current-buffer (set-buffer temp-buffer) (make-local-variable (quote org-babel-gnuplot-timestamp-fmt)) (setq org-babel-gnuplot-timestamp-fmt (or (plist-get params :timefmt) "%Y-%m-%d-%H:%M:%S")) (insert (orgtbl-to-generic table (org-combine-plists (quote (:sep " " :fmt org-babel-gnuplot-quote-tsv-field)) params)))) (save-current-buffer (set-buffer temp-buffer) (write-region nil nil temp-file nil 0)))
(unwind-protect (prog1 (save-current-buffer (set-buffer temp-buffer) (make-local-variable (quote org-babel-gnuplot-timestamp-fmt)) (setq org-babel-gnuplot-timestamp-fmt (or (plist-get params :timefmt) "%Y-%m-%d-%H:%M:%S")) (insert (orgtbl-to-generic table (org-combine-plists (quote (:sep " " :fmt org-babel-gnuplot-quote-tsv-field)) params)))) (save-current-buffer (set-buffer temp-buffer) (write-region nil nil temp-file nil 0))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer)))
(let ((temp-file data-file) (temp-buffer (get-buffer-create (generate-new-buffer-name " *temp file*")))) (unwind-protect (prog1 (save-current-buffer (set-buffer temp-buffer) (make-local-variable (quote org-babel-gnuplot-timestamp-fmt)) (setq org-babel-gnuplot-timestamp-fmt (or (plist-get params :timefmt) "%Y-%m-%d-%H:%M:%S")) (insert (orgtbl-to-generic table (org-combine-plists (quote ...) params)))) (save-current-buffer (set-buffer temp-buffer) (write-region nil nil temp-file nil 0))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer))))
org-babel-gnuplot-table-to-data((3 2 4 4 2 1 0 2) "/tmp/babel-31898wPP/gnuplot-31898Kkb" ((:comments . "") (:shebang . "") (:cache . "no") (:padline . "") (:noweb . "no") (:tangle . "no") (:exports . "results") (:results . "file replace") (:var data 3 2 4 4 2 1 0 2) (:hlines . "no") (:session) (:file . "histogram.pdf") (:result-type . value) (:result-params "file" "replace") (:rowname-names) (:colname-names)))
(if (listp (cdr pair)) (org-babel-gnuplot-table-to-data (cdr pair) (org-babel-temp-file "gnuplot-") params) (cdr pair))
(cons (car pair) (if (listp (cdr pair)) (org-babel-gnuplot-table-to-data (cdr pair) (org-babel-temp-file "gnuplot-") params) (cdr pair)))
(lambda (pair) (cons (car pair) (if (listp (cdr pair)) (org-babel-gnuplot-table-to-data (cdr pair) (org-babel-temp-file "gnuplot-") params) (cdr pair))))((data 3 2 4 4 2 1 0 2))
mapcar((lambda (pair) (cons (car pair) (if (listp (cdr pair)) (org-babel-gnuplot-table-to-data (cdr pair) (org-babel-temp-file "gnuplot-") params) (cdr pair)))) ((data 3 2 4 4 2 1 0 2)))
(let ((*org-babel-gnuplot-missing* (cdr (assoc :missing params)))) (mapcar (function (lambda (pair) (cons (car pair) (if (listp (cdr pair)) (org-babel-gnuplot-table-to-data (cdr pair) (org-babel-temp-file "gnuplot-") params) (cdr pair))))) (mapcar (function cdr) (org-babel-get-header params :var))))
org-babel-gnuplot-process-vars(((:comments . "") (:shebang . "") (:cache . "no") (:padline . "") (:noweb . "no") (:tangle . "no") (:exports . "results") (:results . "file replace") (:var data 3 2 4 4 2 1 0 2) (:hlines . "no") (:session) (:file . "histogram.pdf") (:result-type . value) (:result-params "file" "replace") (:rowname-names) (:colname-names)))
(let* ((vars (org-babel-gnuplot-process-vars params)) (out-file (cdr (assoc :file params))) (prologue (cdr (assoc :prologue params))) (epilogue (cdr (assoc :epilogue params))) (term (or (cdr (assoc :term params)) (if out-file (progn (let (...) (or ... ext)))))) (cmdline (cdr (assoc :cmdline params))) (title (cdr (assoc :title params))) (lines (cdr (assoc :line params))) (sets (cdr (assoc :set params))) (x-labels (cdr (assoc :xlabels params))) (y-labels (cdr (assoc :ylabels params))) (timefmt (cdr (assoc :timefmt params))) (time-ind (or (cdr (assoc :timeind params)) (if timefmt (progn 1)))) (add-to-body (function (lambda (text) (setq body (concat text "\n" body))))) output) (if title (progn (funcall add-to-body (format "set title '%s'" title)))) (if lines (progn (mapc (function (lambda (el) (funcall add-to-body el))) lines))) (if sets (progn (mapc (function (lambda (el) (funcall add-to-body (format "set %s" el)))) sets))) (if x-labels (progn (funcall add-to-body (format "set xtics (%s)" (mapconcat (function (lambda ... ...)) x-labels ", "))))) (if y-labels (progn (funcall add-to-body (format "set ytics (%s)" (mapconcat (function (lambda ... ...)) y-labels ", "))))) (if time-ind (progn (funcall add-to-body "set xdata time") (funcall add-to-body (concat "set timefmt \"" (or timefmt "%Y-%m-%d-%H:%M:%S") "\"")))) (if out-file (progn (funcall add-to-body (format "set output \"%s\"" out-file)) (setq body (concat body "\nset output\n")))) (if term (progn (funcall add-to-body (format "set term %s" term)))) (funcall add-to-body (mapconcat (function identity) (org-babel-variable-assignments:gnuplot params) "\n")) (mapc (function (lambda (pair) (setq body (replace-regexp-in-string (format "\\$%s" (car pair)) (cdr pair) body)))) vars) (if prologue (progn (funcall add-to-body prologue))) (if epilogue (progn (setq body (concat body "\n" epilogue)))))
(progn (let* ((vars (org-babel-gnuplot-process-vars params)) (out-file (cdr (assoc :file params))) (prologue (cdr (assoc :prologue params))) (epilogue (cdr (assoc :epilogue params))) (term (or (cdr (assoc :term params)) (if out-file (progn (let ... ...))))) (cmdline (cdr (assoc :cmdline params))) (title (cdr (assoc :title params))) (lines (cdr (assoc :line params))) (sets (cdr (assoc :set params))) (x-labels (cdr (assoc :xlabels params))) (y-labels (cdr (assoc :ylabels params))) (timefmt (cdr (assoc :timefmt params))) (time-ind (or (cdr (assoc :timeind params)) (if timefmt (progn 1)))) (add-to-body (function (lambda (text) (setq body (concat text "\n" body))))) output) (if title (progn (funcall add-to-body (format "set title '%s'" title)))) (if lines (progn (mapc (function (lambda (el) (funcall add-to-body el))) lines))) (if sets (progn (mapc (function (lambda (el) (funcall add-to-body ...))) sets))) (if x-labels (progn (funcall add-to-body (format "set xtics (%s)" (mapconcat (function ...) x-labels ", "))))) (if y-labels (progn (funcall add-to-body (format "set ytics (%s)" (mapconcat (function ...) y-labels ", "))))) (if time-ind (progn (funcall add-to-body "set xdata time") (funcall add-to-body (concat "set timefmt \"" (or timefmt "%Y-%m-%d-%H:%M:%S") "\"")))) (if out-file (progn (funcall add-to-body (format "set output \"%s\"" out-file)) (setq body (concat body "\nset output\n")))) (if term (progn (funcall add-to-body (format "set term %s" term)))) (funcall add-to-body (mapconcat (function identity) (org-babel-variable-assignments:gnuplot params) "\n")) (mapc (function (lambda (pair) (setq body (replace-regexp-in-string (format "\\$%s" ...) (cdr pair) body)))) vars) (if prologue (progn (funcall add-to-body prologue))) (if epilogue (progn (setq body (concat body "\n" epilogue))))) body)
(unwind-protect (progn (let* ((vars (org-babel-gnuplot-process-vars params)) (out-file (cdr (assoc :file params))) (prologue (cdr (assoc :prologue params))) (epilogue (cdr (assoc :epilogue params))) (term (or (cdr (assoc :term params)) (if out-file (progn ...)))) (cmdline (cdr (assoc :cmdline params))) (title (cdr (assoc :title params))) (lines (cdr (assoc :line params))) (sets (cdr (assoc :set params))) (x-labels (cdr (assoc :xlabels params))) (y-labels (cdr (assoc :ylabels params))) (timefmt (cdr (assoc :timefmt params))) (time-ind (or (cdr (assoc :timeind params)) (if timefmt (progn 1)))) (add-to-body (function (lambda (text) (setq body ...)))) output) (if title (progn (funcall add-to-body (format "set title '%s'" title)))) (if lines (progn (mapc (function (lambda ... ...)) lines))) (if sets (progn (mapc (function (lambda ... ...)) sets))) (if x-labels (progn (funcall add-to-body (format "set xtics (%s)" (mapconcat ... x-labels ", "))))) (if y-labels (progn (funcall add-to-body (format "set ytics (%s)" (mapconcat ... y-labels ", "))))) (if time-ind (progn (funcall add-to-body "set xdata time") (funcall add-to-body (concat "set timefmt \"" (or timefmt "%Y-%m-%d-%H:%M:%S") "\"")))) (if out-file (progn (funcall add-to-body (format "set output \"%s\"" out-file)) (setq body (concat body "\nset output\n")))) (if term (progn (funcall add-to-body (format "set term %s" term)))) (funcall add-to-body (mapconcat (function identity) (org-babel-variable-assignments:gnuplot params) "\n")) (mapc (function (lambda (pair) (setq body (replace-regexp-in-string ... ... body)))) vars) (if prologue (progn (funcall add-to-body prologue))) (if epilogue (progn (setq body (concat body "\n" epilogue))))) body) (set-window-configuration wconfig))
(let ((wconfig (current-window-configuration))) (unwind-protect (progn (let* ((vars (org-babel-gnuplot-process-vars params)) (out-file (cdr (assoc :file params))) (prologue (cdr (assoc :prologue params))) (epilogue (cdr (assoc :epilogue params))) (term (or (cdr ...) (if out-file ...))) (cmdline (cdr (assoc :cmdline params))) (title (cdr (assoc :title params))) (lines (cdr (assoc :line params))) (sets (cdr (assoc :set params))) (x-labels (cdr (assoc :xlabels params))) (y-labels (cdr (assoc :ylabels params))) (timefmt (cdr (assoc :timefmt params))) (time-ind (or (cdr ...) (if timefmt ...))) (add-to-body (function (lambda ... ...))) output) (if title (progn (funcall add-to-body (format "set title '%s'" title)))) (if lines (progn (mapc (function ...) lines))) (if sets (progn (mapc (function ...) sets))) (if x-labels (progn (funcall add-to-body (format "set xtics (%s)" ...)))) (if y-labels (progn (funcall add-to-body (format "set ytics (%s)" ...)))) (if time-ind (progn (funcall add-to-body "set xdata time") (funcall add-to-body (concat "set timefmt \"" ... "\"")))) (if out-file (progn (funcall add-to-body (format "set output \"%s\"" out-file)) (setq body (concat body "\nset output\n")))) (if term (progn (funcall add-to-body (format "set term %s" term)))) (funcall add-to-body (mapconcat (function identity) (org-babel-variable-assignments:gnuplot params) "\n")) (mapc (function (lambda (pair) (setq body ...))) vars) (if prologue (progn (funcall add-to-body prologue))) (if epilogue (progn (setq body (concat body "\n" epilogue))))) body) (set-window-configuration wconfig)))
org-babel-expand-body:gnuplot("set xrange [-0.5:25.5]\nset yrange [0:4.2]\nplot data with histograms notitle" ((:comments . "") (:shebang . "") (:cache . "no") (:padline . "") (:noweb . "no") (:tangle . "no") (:exports . "results") (:results . "file replace") (:var data 3 2 4 4 2 1 0 2) (:hlines . "no") (:session) (:file . "histogram.pdf") (:result-type . value) (:result-params "file" "replace") (:rowname-names) (:colname-names)))
(let ((session (cdr (assoc :session params))) (result-type (cdr (assoc :results params))) (out-file (cdr (assoc :file params))) (body (org-babel-expand-body:gnuplot body params)) output) (let ((wconfig (current-window-configuration))) (unwind-protect (progn (if (string= session "none") (let ((script-file ...)) (let (... ...) (unwind-protect ... ...)) (message "gnuplot \"%s\"" script-file) (setq output (shell-command-to-string ...)) (message output)) (let ((temp-buffer ...)) (save-current-buffer (set-buffer temp-buffer) (unwind-protect ... ...)))) (if (member "output" (split-string result-type)) output nil)) (set-window-configuration wconfig))))
org-babel-execute:gnuplot("set xrange [-0.5:25.5]\nset yrange [0:4.2]\nplot data with histograms notitle" ((:comments . "") (:shebang . "") (:cache . "no") (:padline . "") (:noweb . "no") (:tangle . "no") (:exports . "results") (:results . "file replace") (:var data 3 2 4 4 2 1 0 2) (:hlines . "no") (:session) (:file . "histogram.pdf") (:result-type . value) (:result-params "file" "replace") (:rowname-names) (:colname-names)))
next reply other threads:[~2014-03-23 15:44 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-23 15:44 Eric S Fraga [this message]
2014-03-23 17:51 ` [bug] cannot extract just one column of table for use in gnuplot src block Achim Gratz
2014-03-24 8:22 ` Eric S Fraga
2014-03-24 13:57 ` Bastien
2014-03-25 18:04 ` Achim Gratz
2014-03-25 20:59 ` Bastien
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=871txs2a3o.fsf@ucl.ac.uk \
--to=e.fraga@ucl.ac.uk \
--cc=emacs-orgmode@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).