code: def find_all(self, name=None, **attrs):
          r
          for descendant in self.__descendants():
              if hasattr(descendant, '__match__') and \
                      descendant.__match__(name, attrs):
                  yield descendant
docs: r"""Return all descendant nodes matching criteria.
  
          :param Union[None,str] name: name of LaTeX expression
          :param attrs: LaTeX expression attributes, such as item text.
          :return: All descendant nodes matching criteria
          :rtype: Iterator[TexNode]
  
          >>> from TexSoup import TexSoup
          >>> soup = TexSoup(r'''
          ... \section{Ooo}
          ... \textit{eee}
          ... \textit{ooo}''')
          >>> gen = soup.find_all('textit')
          >>> next(gen)
          \textit{eee}
          >>> next(gen)
          \textit{ooo}
          >>> next(soup.find_all('textbf'))
          Traceback (most recent call last):
          ...
          StopIteration