क्या मैं एक सूत्र के आधार पर एक ऑर्ग-मोड तालिका में कोशिकाओं को प्रारूपित कर सकता हूं?


17

मेरे पास प्रत्येक सेल में संख्याओं के साथ एक org- मोड तालिका में एक कॉलम है। यदि सेल 1 से नीचे या 2 से ऊपर है, तो मैं सेल का बैकग्राउंड कलर बदल कर लाल करना चाहूंगा।

मैं उसे कैसे कर सकता हूँ?


3
बड़ा अच्छा सवाल! org-table-edit-formulasउर्फ C-c 'और org-table-toggle-coordinate-overlaysउर्फ दोनों इस प्रकार की हाइलाइटिंग सुविधा को लागू करने के बारे में सुरागC-c } प्रदान करते हैं। शायद एक विशिष्ट गुरु कुछ अतिरिक्त संकेत या उदाहरण प्रदान करेगा।
मेलियोरैटस

जवाबों:


5

मुझे कुछ एलिस्प के साथ काम करने के लिए पूरी-तालिका स्वरूपण मिला:

एक सूत्र का मूल्यांकन कोशिकाओं की सामग्री के लिए किया जाता है, और एक ढाल का उपयोग करके रंग में परिवर्तित किया जाता है।

कोड सहित संगठन फ़ाइल:

#+name: item-prices
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Item                  | Weight | Label Price | Ratio | CS-F | <-LR |   <-WR | CS-N | Si-N | Si-2 | St-N | St-F |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Охотничье ружьё       |    3.3 |         400 |   121 |   40 |   10 |  11.82 |      |   40 |   40 |   50 |   60 |
| «Гадюка-5»            |   2.88 |        3000 |  1042 |  300 |   10 | 103.82 |      |  300 |  300 |  375 |  450 |
| Обрез                 |   1.90 |         200 |   105 |   20 |   10 |  10.00 |      |   20 |   20 |   25 |   30 |
| ПМм                   |   0.73 |         300 |   411 |   30 |   10 |  39.73 |      |   30 |   30 |   37 |   45 |
| АКМ-74/2 *            |   3.07 |        4000 |  1303 |  637 |   16 | 207.49 |      |  318 |  318 |  398 |  478 |
| АКМ-74/2У             |   2.71 |        2100 |   775 |  420 |   20 | 154.61 |      |  210 |  210 |  262 |  315 |
| ПБ-1с                 |   0.97 |         400 |   412 |  120 |   30 | 122.68 |  100 |   40 |   40 |   50 |   60 |
| «Чeйзер-13»           |   3.00 |        1250 |   417 |      |      |        |      |  125 |      |      |      |
| «Чeйзер-13» *         |        |        1250 |   417 |  200 |   16 |  66.33 |      |  100 |  100 |  125 |  149 |
| ХПСС-1м               |   0.94 |         600 |   682 |      |      |        |      |   60 |      |      |      |
| ХПСС-1м *             |   0.88 |         600 |   682 |   92 |   15 | 104.55 |      |   46 |   46 |   57 |   69 |
| «Фора-12»             |   0.83 |         600 |   723 |  120 |   20 | 143.37 |      |   60 |   60 |   74 |   90 |
| «Кора-919»            |   1.10 |        1500 |       |      |      |        |      |  150 |  150 |      |  225 |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Прицел ПСО-1          |   0.20 |        1000 |  5000 |  100 |   10 | 500.00 |      |  150 |  150 |  150 |  200 |
| Детектор «Отклик»     |   0.00 |         500 |   inf |   50 |   10 |  50.00 |      |  100 |  100 |  175 |  250 |
| Детектор «Медведь»    |   0.00 |        1000 |   inf |  100 |   10 | 100.00 |      |      |      |      |  500 |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Кожаная куртка        |   3.00 |         500 |   167 |  250 |   50 |  83.33 |      |    - |    - |  200 |      |
| Бронежилет ЧН-1       |   4.00 |        5000 |  1250 | 2500 |   50 | 625.00 |      |    - |    - |      |      |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Аптечка               |   0.10 |         300 |  3000 |   30 |   10 | 300.00 |   16 |   45 |   45 |  105 |  150 |
| Бинт                  |   0.05 |         200 |  4000 |   20 |   10 | 400.00 |   11 |   30 |      |   70 |  100 |
| Противорад. п.        |   0.05 |         300 |  6000 |   30 |   10 | 600.00 |   16 |   45 |      |  105 |  150 |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Водка «Казаки»        |   0.60 |         100 |   167 |  100 |  100 | 166.67 |  100 |    - |    - |    - |    - |
| «Завтрак туриста»     |   0.30 |         100 |   333 |  100 |  100 | 333.33 |      |    - |    - |    - |    - |
| Колбаса «Диетическая» |   0.50 |          50 |   100 |   50 |  100 | 100.00 |      |    - |    - |    - |    - |
| Хлеб                  |   0.30 |          20 |    67 |   20 |  100 |  66.67 |      |    - |    - |    - |    - |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Патроны 9x18 мм       |   0.20 |          50 |   250 |    5 |   10 |  25.00 |    3 |    7 |    7 |    5 |    5 |
| Патроны 9x19 мм РВР   |   0.24 |         100 |   417 |   20 |   20 |  83.33 |   15 |      |      |      |      |
| Патроны 9x19 мм ЦМО   |   0.24 |         100 |   417 |      |    0 |   0.00 |      |   15 |   15 |   15 |   20 |
| Патроны 12x70 дробь   |   0.45 |          10 |    22 |    1 |   10 |   2.22 |    0 |    1 |      |    1 |    1 |
| Патроны 12x76 жекан   |   0.50 |          20 |    40 |    4 |   20 |   8.00 |    3 |    1 |      |    3 |    4 |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| Граната РГД-5         |   0.30 |         350 |       |      |      |        |      |   52 |   52 |   70 |   70 |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
| «Медуза»              |    0.5 |        4000 |  8000 |      |    0 |   0.00 |      | 2800 | 3600 | 2500 | 2800 |
|-----------------------+--------+-------------+-------+------+------+--------+------+------+------+------+------|
#+TBLFM: $4='(/ (string-to-number $3) (string-to-number $2));%1.f
#+TBLFM: $6='(/ (string-to-number $5) 0.01 (string-to-number $3));%1.f
#+TBLFM: $7=$5/$2;%1.2f

#+begin_src emacs-lisp :var table=item-prices
  (defun cs/itpl (low high r rlow rhigh)
    "Return the point between LOW and HIGH that corresponds to where R is between RLOW and RHIGH."
    (+ low (/ (* (- high low) (- r rlow)) (- rhigh rlow))))

  (defun cs/gradient (gradient p)
    (if (< p (caar gradient))
        (cdar gradient)
      (while (and (cdr gradient) (> p (caadr gradient)))
        (setq gradient (cdr gradient)))
      (if (null (cdr gradient))
          (cdar gradient)
        (list
         (cs/itpl (nth 1 (car gradient)) (nth 1 (cadr gradient)) p (caar gradient) (caadr gradient))
         (cs/itpl (nth 2 (car gradient)) (nth 2 (cadr gradient)) p (caar gradient) (caadr gradient))
         (cs/itpl (nth 3 (car gradient)) (nth 3 (cadr gradient)) p (caar gradient) (caadr gradient))))))

  (defun cs/scs-table-color ()
    (when (boundp 'cs/cell-color-overlays)
      (mapc #'delete-overlay cs/cell-color-overlays))
    (setq-local cs/cell-color-overlays nil)

    (save-excursion
      (org-table-map-tables
       (lambda ()
         (let* ((table (cl-remove-if-not #'listp (org-table-to-lisp))) ; remove 'hline
                (heading (car table))
                (element (org-element-at-point)))
           (while (and element (not (eq (car element) 'table)))
             (setq element (plist-get (cadr element) :parent)))
           (cond
            ((equal (plist-get (cadr element) :name) "item-prices")

             (org-table-analyze)
             (cl-loop for row being the elements of (cdr table) using (index row-index)
                      do (cl-loop for col being the elements of row using (index col-index)
                                  if (and
                                      (string-match "^..-.$" (nth col-index heading))
                                      (not (zerop (length col)))
                                      (not (equal "0" col)))
                                  do (progn
                                       (org-table-goto-field (format "@%d$%d" (+ 2 row-index) (1+ col-index)))
                                       (forward-char)
                                       (let* ((base-price (string-to-number (nth 2 row)))
                                              (vendor-price (string-to-number col))
                                              (ratio (/ vendor-price 1.0 base-price))
                                              (gradient '((0.10 #x40 #x00 #x00)
                                                          (0.20 #xC0 #x00 #x00)
                                                          (0.50 #x00 #x80 #x00)
                                                          (1.00 #x00 #xFF #x80)))
                                              (color (cs/gradient gradient ratio))
                                              (overlay (make-overlay
                                                        (progn (org-table-beginning-of-field 1) (backward-char) (point))
                                                        (progn (org-table-end-of-field 1) (forward-char) (point))))
                                              (bg (apply #'message "#%02x%02x%02x" color))
                                              (fg (if (< (apply #'+ color) 383) "#ffffff" "#000000"))
                                              (face (list
                                                     :background bg
                                                     :foreground fg)))
                                         (overlay-put overlay 'face face)
                                         (push overlay cs/cell-color-overlays)))))))))
       t)))

  (add-hook 'org-ctrl-c-ctrl-c-hook 'cs/scs-table-color nil t)
  nil
#+end_src

यह बढ़िया है! मैं थोड़ा और अधिक गहराई से वर्णन करना पसंद करूंगा कि यह सब कैसे जुड़ा हुआ है, भले ही यह सिर्फ "जब आप एक्स करते हैं तो यह कोड चलता है, यह वाई और जेड को इनपुट के रूप में लेता है, और यह वही है जो यह मेज पर करता है" :)
ट्रेवोके

धन्यवाद। यह आपके दो उत्तरों का एक संयोजन है। इसमें कुछ अतिरेक है क्योंकि यह दोनों ऑर्गन-बाबेल से टेबल डेटा प्राप्त करता है और टेबल नाम घोषणा के लिए खोज करता है (ताकि यह ओवरले आदि जोड़ सके)। वहां से, यह प्राप्त तालिका डेटा से ऑर्ग-टेबल सेल निर्देशांक तक पंक्ति और स्तंभ संख्या को मैप करता है। cs/itplसरल रैखिक प्रक्षेप cs/gradientकरता है , और डेटा बिंदुओं और रंग स्टॉप की सूची का उपयोग करके एक रंग को प्रक्षेपित करने के लिए इसका उपयोग करता है। वहाँ से, यह आपके उत्तर में एक उपरिशायी जोड़ता है। उदाहरण थोड़ा गैर-तुच्छ है क्योंकि यह तालिका में कहीं और से डेटा को संरक्षित करता है।
व्लादिमीर पेंटेलेव

एक नए संस्करण के साथ कोड अपडेट किया गया जो नाम / डेटा अतिरेक को ठीक करता है, पुराने ओवरले को साफ़ करता है, और स्वयं को एक org-ctrl-c-ctrl-c-हुक के रूप में पंजीकृत करता है ताकि आपको चलाने के लिए कोड ब्लॉक पर बिंदु न लगाना पड़े यह। यह दस्तावेज़ के सभी शिष्टाचार को भी अपडेट कर सकता है org-table-map-tables
व्लादिमीर पेंटेलेव

एक दम बढ़िया। मुझे उन लोगों के लिए कुछ और टिप्पणियाँ पसंद हैं जो यहाँ आ सकते हैं और अपरिचित से अपरिचित हो सकते हैं, लेकिन यह आश्चर्यजनक है, धन्यवाद!
ट्रेवोके

@VladimirPanteleev क्या आप जानते हैं कि क्या मैं इसे अपने कॉन्फिगर में जोड़ सकता हूं और इसे "इनबिल्ट" फंक्शन कर सकता हूं?
टेकोसोर

4

एक ओवरले का उपयोग करना है कि मैं इसे कैसे करना चाहता हूं। मैं org-ctrl-c-ctrl-c-हुक में हुक कर सकता हूं। इसका मतलब है कि मैं चेक को चलाने के लिए Cc Cc को दबा सकता हूं।

मुझे ठीक से जांचने की आवश्यकता है कि मैं एक तालिका के अंदर हूं और सभी कोशिकाओं के लिए इसे चलाता हूं।

फिर मुझे शायद संरेखण फ़ंक्शन में हुक करने की आवश्यकता है या तो ओवरले को फिर से करें या कम से कम उन्हें साफ़ करें।

यह कोड सेल पृष्ठभूमि के लिए लाल बना देगा, अगर मैं Cc Cc को दबाता हूं तो मान 1 से कम या 2 से अधिक है ... लेकिन यह अभी भी छोटी गाड़ी है और ओवरले को साफ कर देगा यदि उनमें से कोई एक नहीं है ' t नियमों से मेल खाता है।

(defun staggering ()
  (save-excursion
    (let* ((ot-field-beginning (progn (org-table-beginning-of-field 1) (point)))
           (ot-field-end (progn (org-table-end-of-field 1) (point)))
           (cell-text (buffer-substring ot-field-beginning ot-field-end)))
      (if (or (< (string-to-number cell-text) 1)
              (> (string-to-number cell-text) 2))
          (overlay-put (make-overlay
                        (progn (org-table-beginning-of-field 1) (point))
                        (progn (org-table-end-of-field 1) (point)))
                       'face '(:background "#FF0000"))))))
(add-hook 'org-ctrl-c-ctrl-c-hook 'staggering)

2

यह अभी तक एक उत्तर नहीं है, लेकिन मैं उन चीजों का ट्रैक रखना चाहता हूं जो मैं यहां खोजता हूं, क्योंकि वे किसी और को एक विचार दे सकते हैं।

सेल के मूल्य को सशर्त रूप से संशोधित करना संभव है :

हम फॉर्मूला फंक्शन को क्विक रूप से बना सकते हैं और फिर इसे फॉर्मूला लाइन से कॉल कर सकते हैं:

#+BEGIN_SRC emacs-lisp :results silent
(defun danger (cell)
  (if (or (< (string-to-number cell) 1)
          (> (string-to-number cell) 2))
        (concat (int-to-string (string-to-number cell)) "!")
        cell))
#+END_SRC

और इसका उपयोग इस तरह किया जा सकता है:

| String | Num | 
|--------+-----| 
| Foo    |   2 | 
| Bar    |   1 | 
| Baz    |  3! | 
|--------+-----|
#+TBLFM: $2='(danger @0$0)

मुझे लगता है कि मुझे जो चाहिए वह एक ओवरले के निर्माण की आवश्यकता हो सकती है।


2

Emacs फ़ंक्शन प्रदान करता है hi-lock-face-buffer M-s h rजो आपके द्वारा लिखते ही बफ़र में एक नियमित अभिव्यक्ति को उजागर करता है ।

हमें बस एक नियमित अभिव्यक्ति की आवश्यकता है जो किसी भी संख्या से मेल खाती है जो 1 या 2 नहीं है और एक तालिका के सेल के भीतर है। इसे इस्तेमाल करे:

| *\(-[0-9]+\|[03-9]\|[0-9][0-9]+\) *|

(आप के साथ M-nऔर पिछले अभिव्यक्तियों को याद कर सकते हैं M-p।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.