diff --git a/README.md b/README.md
index d06de88e1ae35212610d54e4380654f06c4e4458..499ab1abb6c9322233c2b50b84ba71fe2a505bb9 100644
--- a/README.md
+++ b/README.md
@@ -47,8 +47,6 @@ if __name__ == "__main__":
 ```
 The output can be found in `examples/students/f_tag.py`. It will cut out the body of the function but leave any return statement and docstrings. It will also raise an exception (and print how many lines are missing) to help students.
 ```python
-"""
-"""
 def myfun(a,b): 
     """ The doc-string is not removed. """
     # TODO: 1 lines missing.
@@ -75,8 +73,6 @@ print("and that is a fact!")
 ```
 Is compiled into:
 ```python 
-"""
-"""
 def primes_sieve(limit):
     # TODO: 8 lines missing.
     raise NotImplementedError("Compute the list `primes` here of all primes up to `limit`")
@@ -120,44 +116,30 @@ This example will produce three files
 ```python 
 # s_tag.py
 print("Area of square of width", width, "and height", height, "is:") 
-print(width*height)  #!s  # This is an example of a simple cutout
-print("and that is a fact!")
-print("An extra cutout") #!s #!s  # This will be added to the above cutout
-def primes_sieve(limit): 
 print(width*height)  
-print("and that is a fact!")
-print("An extra cutout") #!s #!s  # This will be added to the above cutout
-def primes_sieve(limit): 
-    limitn = limit+1
-    primes = range(2, limitn)
-    for i in primes: 
-print("An extra cutout") 
-def primes_sieve(limit): 
-    limitn = limit+1
-    primes = range(2, limitn)
-    for i in primes: 
-        factors = list(range(i, limitn, i))
-        for f in factors[1:]:
-            if f in primes:
-                primes.remove(f)  
-print("An extra cutout") 
+print("An extra cutout")
+```
+and 
+```python 
+# s_tag.py
 def primes_sieve(limit): 
     limitn = limit+1
     primes = range(2, limitn)
-    for i in primes: 
+    for i in primes: #!s=b A nested/named cutout.
         factors = list(range(i, limitn, i))
         for f in factors[1:]:
             if f in primes:
-                primes.remove(f)  
+                primes.remove(f)  #!s=b
     return primes
-```
-and 
-```python 
-
 ```
 and finally:
 ```python 
-
+# s_tag.py
+    for i in primes: 
+        factors = list(range(i, limitn, i))
+        for f in factors[1:]:
+            if f in primes:
+                primes.remove(f)
 ```
 I recommend using `\inputminted{filename}` to insert the cutouts in LaTeX. 
 
diff --git a/docs/build_docs.py b/docs/build_docs.py
index a0011a29033c5f2e0abc9cec3922873c0fe910ef..fc76bca9af85daf55e3524640504164802a1ab39 100644
--- a/docs/build_docs.py
+++ b/docs/build_docs.py
@@ -19,9 +19,6 @@ def my_nup(path):
 if __name__ == "__main__":
     from snipper.fix_s import save_s
     from snipper.snipper_main import censor_file
-    # from examples.process_cs101_references import main
-    # main()
-
     data = {}
     EX_BASE = "../examples"
     np = EX_BASE + "/latex"
diff --git a/examples/cs101_output/s_tag.py b/examples/cs101_output/s_tag.py
index fcddb99bef1e9f08f28e0b729a35df04b70ed66b..b7ef42bb851522f60a2f00eb269177e39041426c 100644
--- a/examples/cs101_output/s_tag.py
+++ b/examples/cs101_output/s_tag.py
@@ -1,39 +1,4 @@
 # s_tag.py
 print("Area of square of width", width, "and height", height, "is:") 
-print(width*height)  #!s  # This is an example of a simple cutout
-print("and that is a fact!")
-print("An extra cutout") #!s #!s  # This will be added to the above cutout
-
-def primes_sieve(limit): 
 print(width*height)  
-print("and that is a fact!")
-print("An extra cutout") #!s #!s  # This will be added to the above cutout
-
-def primes_sieve(limit): 
-    limitn = limit+1
-    primes = range(2, limitn)
-
-    for i in primes: 
-print("An extra cutout") 
-
-def primes_sieve(limit): 
-    limitn = limit+1
-    primes = range(2, limitn)
-
-    for i in primes: 
-        factors = list(range(i, limitn, i))
-        for f in factors[1:]:
-            if f in primes:
-                primes.remove(f)  
-print("An extra cutout") 
-
-def primes_sieve(limit): 
-    limitn = limit+1
-    primes = range(2, limitn)
-
-    for i in primes: 
-        factors = list(range(i, limitn, i))
-        for f in factors[1:]:
-            if f in primes:
-                primes.remove(f)  
-    return primes 
\ No newline at end of file
+print("An extra cutout") 
\ No newline at end of file
diff --git a/examples/cs101_output/s_tag_a.py b/examples/cs101_output/s_tag_a.py
new file mode 100644
index 0000000000000000000000000000000000000000..5266c17b8c8931ddec96d808d0abbd8e92162a0f
--- /dev/null
+++ b/examples/cs101_output/s_tag_a.py
@@ -0,0 +1,11 @@
+# s_tag.py
+def primes_sieve(limit): 
+    limitn = limit+1
+    primes = range(2, limitn)
+
+    for i in primes: #!s=b A nested/named cutout.
+        factors = list(range(i, limitn, i))
+        for f in factors[1:]:
+            if f in primes:
+                primes.remove(f)  #!s=b
+    return primes 
\ No newline at end of file
diff --git a/examples/cs101_output/s_tag_b.py b/examples/cs101_output/s_tag_b.py
new file mode 100644
index 0000000000000000000000000000000000000000..f8e891b85bdaf8a56fa5df8c0b4463b92ccee472
--- /dev/null
+++ b/examples/cs101_output/s_tag_b.py
@@ -0,0 +1,6 @@
+# s_tag.py
+    for i in primes: 
+        factors = list(range(i, limitn, i))
+        for f in factors[1:]:
+            if f in primes:
+                primes.remove(f)  
\ No newline at end of file
diff --git a/examples/cs101_students/b_tag.py b/examples/cs101_students/b_tag.py
index b0e5de3b46df099311b67cd5b0d7f515bfbbf46f..a6457f1045e00e9b301f9a426c650fe00eea3b24 100644
--- a/examples/cs101_students/b_tag.py
+++ b/examples/cs101_students/b_tag.py
@@ -1,5 +1,3 @@
-"""
-"""
 def primes_sieve(limit):
     # TODO: 8 lines missing.
     raise NotImplementedError("Compute the list `primes` here of all primes up to `limit`")
diff --git a/examples/cs101_students/f_tag.py b/examples/cs101_students/f_tag.py
index f1e55a7fd78858690177d4eb2d43cf0353375eb4..12f45dc69b6a2e50892b579f4a26a25af4e575a3 100644
--- a/examples/cs101_students/f_tag.py
+++ b/examples/cs101_students/f_tag.py
@@ -1,5 +1,3 @@
-"""
-"""
 def myfun(a,b): 
     """ The doc-string is not removed. """
     # TODO: 1 lines missing.
diff --git a/examples/cs101_students/i_tag.py b/examples/cs101_students/i_tag.py
index 59106b7567d50d6935afdb9d53570015d2c40c20..0cf461fa2ac6554fc1a11dfb31d2280baeeb9978 100644
--- a/examples/cs101_students/i_tag.py
+++ b/examples/cs101_students/i_tag.py
@@ -1,5 +1,3 @@
-"""
-"""
 for animal in ["Dog", "cat", "wolf"]: 
     print("An example of a four legged animal is", animal) 
 
diff --git a/examples/cs101_students/o_tag.py b/examples/cs101_students/o_tag.py
index e0d31b05a3e6e6603134446eef6125bf53812a58..ab7e7a330eb46cfb246d86a21398367312a02f90 100644
--- a/examples/cs101_students/o_tag.py
+++ b/examples/cs101_students/o_tag.py
@@ -1,5 +1,3 @@
-"""
-"""
 if __name__ == "__main__":
     print("Here are the first 4 square numbers") 
     for k in range(1,5):
diff --git a/examples/cs101_students/s_tag.py b/examples/cs101_students/s_tag.py
index 102fcafec9ce3e86bc09357f09a9bacc4b73849f..fa44532b64dc30f0d983ea5d70f3120248074175 100644
--- a/examples/cs101_students/s_tag.py
+++ b/examples/cs101_students/s_tag.py
@@ -1,5 +1,3 @@
-"""
-"""
 width, height = 2, 4
 print("Area of square of width", width, "and height", height, "is:") 
 print(width*height)  
diff --git a/examples/output/citations.py b/examples/output/citations.py
deleted file mode 100644
index 7904c3f44f403f483d07e71f5b5c606f220f676d..0000000000000000000000000000000000000000
--- a/examples/output/citations.py
+++ /dev/null
@@ -1,14 +0,0 @@
-"""
-References:
-  [Ber07] Dimitri P. Bertsekas. Dynamic Programming and Optimal Control, Vol. II. Athena Scientific, 3rd edition, 2007. ISBN 1886529302.
-  [Her21] Tue Herlau. Sequential decision making. (See 02465_Notes.pdf), 2021.
-"""
-def myfun(): #!s
-    """
-    To solve this exercise, look at eq. (1) in Section 1.
-    You can also look at (Ber07) and (Her21)
-    More specifically, look at (Ber07, Equation 117) and (Her21, Figure 1)
-
-    We can also write a special tag to reduce repetition: (Her21, Figure 1) and (Her21, Section 1).
-    """
-    return 42 #!s
\ No newline at end of file
diff --git a/examples/output/load_references_a.py b/examples/output/load_references_a.py
deleted file mode 100644
index 672cac255810264aa57dc7339c0dbb8134fdf56e..0000000000000000000000000000000000000000
--- a/examples/output/load_references_a.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# load_references.py
-    from snipper.load_citations import get_bibtex, get_aux
-    bibfile = "latex/library.bib"
-    auxfile = 'latex/index.aux'
-    bibtex = get_bibtex(bibfile)
-    aux = get_aux(auxfile) 
\ No newline at end of file
diff --git a/examples/output/load_references_b.py b/examples/output/load_references_b.py
deleted file mode 100644
index 97642b50a2c9b2a35db1caef483d1d33e7938e75..0000000000000000000000000000000000000000
--- a/examples/output/load_references_b.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# load_references.py
-    file = "citations.py" 
-    with open(file, 'r') as f:
-        lines = f.read().splitlines()
-    lines = fix_aux(lines, aux=aux)
-    lines = fix_aux_special(lines, aux=aux, command='\\nref', bibref='herlau')
-    lines = fix_bibtex(lines, bibtex=bibtex)
-    with open('output/citations.py', 'w') as f:
-        f.write("\n".join(lines)) 
\ No newline at end of file
diff --git a/src/snipper/__pycache__/block_parsing.cpython-38.pyc b/src/snipper/__pycache__/block_parsing.cpython-38.pyc
index 111a915440a38d68e7f4fef83ab63cc6392d7a7e..6e35176913d71822dbada220ed46f50a0ec7f8ad 100644
Binary files a/src/snipper/__pycache__/block_parsing.cpython-38.pyc and b/src/snipper/__pycache__/block_parsing.cpython-38.pyc differ
diff --git a/src/snipper/__pycache__/fix_cite.cpython-38.pyc b/src/snipper/__pycache__/fix_cite.cpython-38.pyc
index de2b1ae6ef85a05fa5550eb02dee7e157751f4bc..eeaf3694f500ec156fce7c14092ca7b9a58030d6 100644
Binary files a/src/snipper/__pycache__/fix_cite.cpython-38.pyc and b/src/snipper/__pycache__/fix_cite.cpython-38.pyc differ
diff --git a/src/snipper/__pycache__/fix_s.cpython-38.pyc b/src/snipper/__pycache__/fix_s.cpython-38.pyc
index b0366cef21b20d77bc837f78f88a9f18d9d97a4b..2b3e3cdf41d7861d72c4559b682c1c4012d59b8d 100644
Binary files a/src/snipper/__pycache__/fix_s.cpython-38.pyc and b/src/snipper/__pycache__/fix_s.cpython-38.pyc differ
diff --git a/src/snipper/__pycache__/snipper_main.cpython-38.pyc b/src/snipper/__pycache__/snipper_main.cpython-38.pyc
index 21d84830317e97a60e1ba13d898e5f34d4cfb140..1d8de50a5424307ec53bd2fafd6baf3d0d974635 100644
Binary files a/src/snipper/__pycache__/snipper_main.cpython-38.pyc and b/src/snipper/__pycache__/snipper_main.cpython-38.pyc differ
diff --git a/src/snipper/block_parsing.py b/src/snipper/block_parsing.py
index a386989177ae66191a7f299d941cfba9ad33b157..f81a7f207dd26e69935aee890332d01cd9a6bccf 100644
--- a/src/snipper/block_parsing.py
+++ b/src/snipper/block_parsing.py
@@ -21,6 +21,16 @@ def block_iterate(lines, tag):
 
 
 def block_split(lines, tag):
+    # print("\n".join(lines))
+    # if tag != "#!s":
+    #     return {}
+
+    if tag =="#!s" and "#!s" in "".join(lines):
+        print("tag is", tag)
+    # else:
+    #     return dict(name="asdfasdf", joined='')
+
+    z = 234
     stag = tag[:2]  # Start of any next tag.
 
     def join(contents):
@@ -30,7 +40,7 @@ def block_split(lines, tag):
     i, j = f2(lines, tag)
 
     def get_tag_args(line):
-        line = line.strip()
+        # line = line.strip()
         k = line.find(" ")
         tag_args = ((line[:k + 1] if k >= 0 else line)[len(tag):] ).strip()
 
@@ -45,8 +55,10 @@ def block_split(lines, tag):
     if i is None:
         return None
     else:
+        print( lines[i] )
+
         start_tag_args = get_tag_args(lines[i][j:])
-        START_TAG = f"{tag}={start_tag_args['']}" if '' in start_tag_args else tag
+        START_TAG = f"{tag}={start_tag_args['']}" if start_tag_args[''] != '' else tag
         END_TAG = START_TAG
         i2, j2 = f2(lines, END_TAG, i=i, j=j+1)
         if i2 == None:
diff --git a/src/snipper/fix_s.py b/src/snipper/fix_s.py
index b8f1d9b35abf9166bc0b194d8e59be6aa9068f19..b21fd60bd84239a1e078ca1afe9612eb2326a363 100644
--- a/src/snipper/fix_s.py
+++ b/src/snipper/fix_s.py
@@ -8,6 +8,10 @@ def get_s(lines):
     blocks = defaultdict(list)
     for c in block_iterate(lines, "#!s"):
         blocks[c['name']].append(c)
+    if len(blocks) > 0:
+        print("\n".join(lines))
+
+        print("asdf")
     output = {}
     for name, co in blocks.items():
         output[name] = [l for c in co for l in c['block']]
diff --git a/src/snipper/snipper_main.py b/src/snipper/snipper_main.py
index 2425f10e4ab3a80a00d0f227247d85020e9fe548..58ac32a2b0710ed1ac5f50a3006f81e117518d31 100644
--- a/src/snipper/snipper_main.py
+++ b/src/snipper/snipper_main.py
@@ -2,12 +2,12 @@ import os
 import functools
 import textwrap
 import re
-# from snipper.fix_s import save_s
+from snipper.fix_s import save_s
+from snipper.fix_cite import fix_citations
 from snipper.fix_bf import fix_f, fix_b2
 from snipper.fix_o import run_o
 from snipper.legacy import indent, block_process
 
-
 def fix_r(lines):
     for i,l in enumerate(lines):
         if "#!r" in l:
@@ -162,7 +162,6 @@ def censor_file(file, info, run_files=True, run_out_dirs=None, cut_files=True, s
     if references == None:
         references = {}
 
-    from snipper.fix_cite import fix_citations
 
     dbug = False
     with open(file, 'r', encoding='utf8') as f:
@@ -194,7 +193,6 @@ def censor_file(file, info, run_files=True, run_out_dirs=None, cut_files=True, s
                 run_o(lines, file=file, output=ofiles[0])
                 run_i(lines, file=file, output=ofiles[0])
             if cut_files:
-                from snipper.fix_s import save_s
 
                 save_s(lines, file_path=os.path.relpath(file, base_path), output_dir=run_out_dirs)  # save file snips to disk
         lines = full_strip(lines, ["#!s", "#!o", '#!i'])